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

Я прочитал все шаги по ограничению значения в 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 ответ

Решение

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

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

Другие вопросы по тегам