【发布时间】:2016-04-14 13:12:44
【问题描述】:
在 Edward Kmett 的演讲 Lenses, Folds, and Traversals 中,在幻灯片“The Power is in the Dot”中,他展示了(.) . (.) . (.) 的类型是
(a -> b) -> (c -> d -> e -> a) -> c -> d -> e -> b
我可以通过在 GHCI 中显示它的类型来查看它。但我也想知道为什么。我想了解的另一件事是为什么从(.) 到(.) . (.) 和(.) . (.) . (.) 的参数定期更改的模式:
(.) :: (a -> b) -> (c -> a) -> c -> b
(.) . (.) :: (a -> b) -> (c -> d -> a) -> c -> d -> b
(.) . (.) . (.) :: (a -> b) -> (c -> d -> e -> a) -> c -> d -> e -> b
附:我尝试通过扩展(.) . (.) 的函数定义自己解决(.) . (.)。应用(.)的定义后我得到:
\x y z t -> x ((y z) t)
所以我推断出类型:
x :: a -> b
y :: c -> d -> a
z :: c
t :: d
但是我在(.) . (.) . (.) 上迷路了。而且我不知道这是否是进行手动类型推断的正确方法。
【问题讨论】:
-
你可能喜欢函数组合的“语义编辑器组合器”视图,我们将
(.)重命名为result。 this post 中给出的直觉非常好,在我看来,这很清楚为什么(.)的堆叠组合会产生它所做的类型。 -
@DanielWagner,感谢您的链接。我很快就会读到它。实际上,我正要搜索“语义编辑器组合器”,因为 Edward 在演讲中经常提到它。
标签: haskell types type-inference function-composition combinators