Проблемы с опциями типа F # - PullRequest
       21

Проблемы с опциями типа F #

1 голос
/ 07 ноября 2010

У меня есть следующий код:

let rec sums1 n = function
            | (a,b,x:int array,s,k) when (s<n&&b=x.Length-1) -> []//None
            | (a,b,x:int array,s,k) when (a=b&&((x.Length-1)=b))->[]// None 
            | (a,b,x,s,k) when (s=n) -> (Array.toList(Array.sub x a k)) 
            | (a,b,x,s,k) when (s<n) -> sums1 n (a,b+1,x,s+x.[b+1],k+1)
            | (a,b,x,s,k) when (s>n) -> sums1 n (a+1,b,x,s-x.[a],k-1)    
            | (a,b,c,d,e) -> []//None

let neco n s =match (sums1 n (0,-1,s,0,0)) with
        | [] ->None
        | x ->Some x
let ssum n xs:list<int> = neco n (List.toArray xs)

Как это возможно, что компилятор не позволяет мне вернуться из значения ssum типа option >. Я верну этот тип, а не что-то еще. У кого-нибудь есть идеи? Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

Я думаю, вам просто не хватает паренов:

let ssum n (xs:list<int>) = neco n (List.toArray xs) 
           ^            ^

Без них вы описываете тип возврата ssum, а не тип аргумента xs.

0 голосов
/ 08 ноября 2010

В этом случае вы можете просто позволить выводу типа выполнить свою работу и удалить объявление типа:

 let ssum n xs = neco n (List.toArray xs)
...