【发布时间】:2019-01-07 20:11:11
【问题描述】:
我非常擅长推断 lambda 表达式的类型,只要它没有任何奇怪的函数,例如 map、filter、foldr 或其中的任何组合。但是,只要我有类似的东西
\x y -> map x (y (. x))
我完全迷路了,我一生都无法弄清楚如何在不使用 ghci 的情况下找出类型。
任何帮助将不胜感激
谢谢
【问题讨论】:
-
通过自己进行类型推断。你能分享一下你的尝试吗?
-
我尝试像这样重写表达式: \xyz -> map x (y (xz)) 然后 \xyz -> map x (y ( (.) xz)) 然后我尝试推断括号内表达式的类型,但我失败了。
-
那么你不能执行这样的重写,因为它是
(. x),它是\z -> (.) z x的缩写,所以重写是\x y -> map x (y (\z -> (.) z x))。 -
好吧,从最外层的函数
map开始。它的类型是(a -> b) -> [a] -> [b],你知道x的类型是a -> b,y (. x)的类型是[a]。然后重复y。 -
Hindley-Milner 的哪一部分你不明白? (Tongue firmly in cheek.)
标签: haskell lambda type-inference typing lambda-calculus