【问题标题】:Deriving the type of (foldr (.))导出 (foldr (.)) 的类型
【发布时间】:2014-06-18 12:43:32
【问题描述】:

我正在尝试手动导出 (foldr (.)) 的类型

foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(.) ::(b2 -> c2) -> (a2 -> b2) -> a2 -> c2

然后:

a1 ~ (b2 -> c2)
b1 ~ (a2 -> b2)
b1 ~ a2

所以我明白了(foldr (.)) :: (a2 -> b2) -> [(b2 -> c2)] -> (a2 -> b2)

但 GHCi 返回::t (foldr (.)) :: (a -> b) -> [b -> b] -> a -> b

为什么b2和c2是一样的?

谢谢,
塞巴斯蒂安。

【问题讨论】:

  • 您意识到您与b1 ~ (a2 -> b2)b1 ~ a2 矛盾吗? (实际上这并不是真正的矛盾,但它会是 Haskell 中没有的“无限类型”。)
  • @leftaroundabout 但是如果我向 GHCi 查询 (foldr (.)) 的类型,我会得到 (a -> b) -> [b -> b] -> a -> b。跨度>

标签: haskell types ghci unification


【解决方案1】:

如果你看(.)的类型为

(b2 -> c2) -> (a2 -> b2) -> (a2 -> c2)

然后

b1 ~ (a2 -> b2)
b1 ~ (a2 -> c2)

所以(b2 ~ c2)

那么你可以看到(foldr (.))的类型是

(a2 -> b2) -> [(b2 -> b2)] -> (a2 -> b2)

这是 GHC 派生的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多