F#值限制

时间:2010-11-01 19:00:39

标签: f# value-restriction

我已经阅读了关于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 个答案:

答案 0 :(得分:11)

请允许我使用我的通灵调试技巧。您无法调用flatten Nil,因为正如编译器指示的那样,对于任何类型'a list,结果可能是'a。您必须添加类型注释,例如(flatten Nil : int list)

在一个不相关的注释中,你在flatten定义中的第二个案例是不必要的,可以删除,因为它也被第三个案例所涵盖。