我需要验证 lambda 表达式的类型:
我的方法给了我:
我试图在 Haskell 中(在 Hugs 上)定义它,如下所示:
h= \f x -> f (f x)
当我调用 :type comamnd 时,它会给我:
(a -> a) -> a -> a
mi 函数在 Haskell 中定义正确吗?或者我的方法给出了错误的结果?
最佳答案
请注意,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)
关于haskell - 验证 lambda 表达式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495616/