我需要验证lambda表达式的类型:
我的方法给了我:
我试图在Haskell中定义它(在Hugs上),如下所示:
h= \f x -> f (f x)
当我打电话给:键入comamnd时,它给了我:
(a -> a) -> a -> a
在Haskell中是否正确定义了mi函数?或者我的方法给出了错误的结果?
答案 0 :(得分:9)
请注意,调用f
同时使用x
和f x
作为参数 - 这意味着x
的类型和f x
的类型必须是相同的[1]。继续这个论点之后,我们看到由于x
是f
的输入而f x
是f
的输出,f
的输入和输出必须是相同的[2]。
最后,我们检查lambda术语
\f x -> f (f x)
它有两个输入,f
(一个函数)和x
,它返回f
的返回类型为[3]。把所有这些信息放在一起我们有
(a -> b) -> c -> d
where:
b ~ c by [1]
a ~ b by [2]
d ~ b by [3]
因此Haskell推断的类型是正确的
h :: (a -> a) -> a -> a
h f x = f (f x)
答案 1 :(得分:3)
类型(a -> b) -> (c -> d)
等同于haskells类型系统中的(a -> b) -> c -> d
。您还需要考虑,如果x具有类型a,并且f x
具有类型b,则f具有类型a -> b
。所以让y = f x
。那么f y === f (f x)
的类型是什么?
答案 2 :(得分:2)
你的Haskell命令没问题。
但您的类型推断不正确。 x
参数的类型应与f
的输入类型统一,因为您调用f x
,然后输入类型f
应与输出类型统一因为您在结果f
上调用了f
,所以(f x)
已被{{1}}。