gpt4 book ai didi

haskell - 如何手动推断 '(.) . (.) . (.)' 的类型?

转载 作者:行者123 更新时间:2023-12-04 13:22:31 24 4
gpt4 key购买 nike

在 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

但是我迷路了 (.) . (.) . (.) .而且我不知道这是否是进行手动类型推断的正确方法。

最佳答案

有功能,

instance Functor ((->) r) where
-- fmap :: (a -> b) -> f a -> f b
-- (a -> b) -> (r -> a) -> (r -> b)
fmap p q x = p (q x) -- fmap = (.)

所以你实际拥有的是 fmap . fmap . fmap :
fmap               :: (a -> b) -> f       a   -> f       b
fmap . fmap :: (a -> b) -> f (g a) -> f (g b)
fmap . fmap . fmap :: (a -> b) -> f (g (h a)) -> f (g (h b))

这是
 (a -> b) -> (c -> (d -> (e -> a))) -> (c -> (d -> (e -> b)))   ~
(a -> b) -> (c -> d -> e -> a) -> (c -> d -> e -> b)

为什么是 fmap . fmap :: (a -> b) -> f (g a) -> f (g b) ?因为,
(fmap . fmap) foo = fmap (fmap foo)
{-
fmap :: (a -> b) -> f a -> f b
foo :: a -> b
fmap foo :: f a -> f b
fmap foo :: g a -> g b
fmap (fmap foo) :: f (g a) -> f (g b)
-}

机械类型推导是关于类型变量的替换和一致重命名。查看更多例如 herehere .

关于haskell - 如何手动推断 '(.) . (.) . (.)' 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com