Ограничение значения 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 не нужен и может быть удален, так как он также охватывается третьим случаем.