Ограничение значения F # - PullRequest
       17

Ограничение значения F #

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

Я прочитал все шаги по ограничению значений в F #, но до сих пор не понимаю этого У меня есть следующий код:

type tree<'a> = 
    | Nil
    | Node of (tree<'a> * 'a * tree<'a>)

let rec flatten = function
    | Nil -> []
    | Node ( Nil, b, Nil ) -> [b]
    | Node ( l, h, p ) -> List.concat [(flatten l);[h];(flatten p)]

и компилятор выдает ошибку:

error FS0030: Value restriction. The value 'it' has been inferred to have generic type
    val it : '_a list    
Either define 'it' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

Кто-нибудь может мне помочь? Большое спасибо;)

1 Ответ

11 голосов
/ 01 ноября 2010

Позвольте мне использовать мои навыки психической отладки.Вы не можете вызвать flatten Nil, потому что, как указывает компилятор, результатом может быть 'a list для любого типа 'a.Вы должны добавить аннотацию типа, например (flatten Nil : int list).

. На несвязанной ноте ваш второй случай в определении сглаживания не нужен и может быть удален, поскольку он также охватывается третьим случаем.

...