2013-04-29 3 views

답변

1
let rec sum a = 
    match a with 
    |Nil -> 0 
    |Link(s,t) -> s+(sum (!t)) 
+0

패턴 일치에 '_'을 사용할 수 있다고 생각하지 않습니다. 맞습니까? 당신은 _ + (sum (! t)) –

+0

을 가지고 있습니다. @JohnOriely 확신을 위해 그것을 바꿔서 테스트 해 보았습니다. –

+0

실제로 잘못된 선언을 입력했기 때문에 작동하지 않습니다. 한번 더 볼 수 있니, 고마워! –

1

예제를 시도했지만 작동하지 않아 문제가 해결되었습니다.

type lists = Nil | Link of (int * (lists ref)) 

let list1 = Link(3, ref (Link (2, ref Nil))) 
let list2 = Link(6, ref (Link (4, ref Nil))) 
let list3 = Link(9, ref (Link (6, ref Nil))) 

let rec sum = function  // or let rec sum list = match list with 
    | Nil    -> 0 
    | Link(head, tail) -> head + sum !tail 

당신은 당신이 그것을 할 경우, 당신은 (일반) 내장 된 '링크리스트'를 가지고 입력 Integer

+0

재미있다. 나는 이것을 시도 할 때 'h'와 'sum! t'유형이 서로 일치하지 않는다고 말한다. –

+0

그것은 나를 위해 일한다. 확실합니까? 처음부터 코드를 시험해보고, 방금 변수의 이름을 변경했습니다. – Gustavo

+0

아 나는 선언 할 때 잘못 입력했다. 유형 rNumber = 정수의 정수 ;; 유형 목록 = 없음 | 링크 (rNumber * (목록 ref)) ;; Integer가 아닌 "rNumber"가 될 수 있습니다. 그래서 'int'가 'rNumber'와 일치하지 않는다는 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있을까요? 지금까지 도와 줘서 고마워! –

10

F 번호로 모든 숫자에 태그를해야합니다, Integer of int를 정의 할 필요가 없습니다 - 그 단지 list라고, 그것은 이미 계산하는 기능을 가지고있는 sum :

let list1 = [2; 3; 5] 
List.sum list1 
목록에

임의 조작은 재귀 함수 사용하여 작성 될 수 :

let rec sum l = 
    match l with 
    | [] -> 0 
    | head::tail -> head + (sum tail) 

있지만, 대부분의 경우 사용하기 충분하다 내장 fold 기능 : 또한

let sum l = 
    List.fold (fun total element -> total + element) 0 l 

참고 위의 '순진한'재귀 함수가 tail-recursive하지 않고,에 적용 할 때 그래서 충돌 것 매우 긴 목록. 기본적으로 fold가하는 일입니다

let sum l = 
    let rec sumAcc acc l = 
    match l with 
     | [] -> acc 
     | head::tail -> sumAcc (acc+head) tail 
    sumAcc 0 l 

: 꼬리 재귀 구현은 다음과 같이 될 것이다.

는 (I이 페이지에서 F 번호의 땅을 모르는 경우 다른 사람이 대답을 추가하고 - 목록을 F #으로 지원에 대해 그/그녀가 잘못된 아이디어를 얻을 수 있습니다) 그냥 완벽을 위해

1

을 :

let sum l = 
    l 
    |> List.reduce (+) 

도 트릭을 수행합니다.

let sum (l:list<int64>) = 
    l 
    |> List.reduce (+) 

나이 :

let inline sum l = 
     l 
     |> List.reduce (+) 

인라인 타입 추론은 다른 숫자 유형을 필요로하는 경우 당신이 (예를 들어, 갈망의 목록을) 할 수 있도록하는 int 목록으로 L을 추론한다 "+"라는 정적 함수를 제공하는 모든 유형에서 작동하도록 sum 함수를 일반화합니다. 를 사용하려면이 같은 코드를 가지고 것 :

let mylist = [1;2;3;4] 
let sumOfMyList = sum mylist;; 

나는 또한 내 경험에 그 목록을 사용하여 주름 및 관련 기능은 자신의 재귀 기능을 압연보다 더 좋은 방법입니다 말할 것입니다.