Wyv*_*666 6 haskell lambda-calculus
我需要验证lambda表达式的类型:
我的方法给了我:
我试图在Haskell(在Hugs上)定义它,如下所示:
h= \f x -> f (f x)
Run Code Online (Sandbox Code Playgroud)
当我打电话给:键入comamnd它给了我:
(a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)
是否在Haskell中正确定义了mi函数?或者我的方法给出了错误的结果?
请注意,f
使用both x
和f x
作为参数调用 - 这立即意味着类型x
和类型f x
必须相同[1].从前面开始这个论证,我们看到由于x
是输入f
和f x
输出f
,输入和输出f
必须相同[2].
最后,我们检查lambda术语
\f x -> f (f x)
Run Code Online (Sandbox Code Playgroud)
它有两个输入,f
(一个函数)和x
,它返回任何返回类型f
[3].把所有这些信息放在一起我们有
(a -> b) -> c -> d
where:
b ~ c by [1]
a ~ b by [2]
d ~ b by [3]
Run Code Online (Sandbox Code Playgroud)
因此Haskell推断出的类型是正确的
h :: (a -> a) -> a -> a
h f x = f (f x)
Run Code Online (Sandbox Code Playgroud)