【问题标题】:Manually deriving the type `(.) (foldr(++)) (map (:))`手动导出类型`(.) (foldr(++)) (map (:))`
【发布时间】:2014-05-02 20:07:35
【问题描述】:

我正在尝试导出 (.) (foldr(++)) (map (:)) 的类型

我首先导出foldr (++)的类型

foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(++)  :: [a2] -> [a2] -> [a2]

a1 ~ [a2]
b1 ~ [a2]
b1 ~ [a2]

所以

foldr (++) :: [a2] -> [[a2]] -> [a2] ~ [a] -> [[a]] -> [a]

然后我推导出map (:)的类型

map :: (a1 -> b1) -> [a1] -> [b1]
(:) :: a2 -> [a2] -> [a2]

a1 ~ a2
b1 ~ [a2] -> [a2]

所以

map (:) :: [a2] -> [[a2] -> [a2]] ~ [a] -> [[a] -> [a]]

终于(.) (foldr(++)) (map (:))的类型

(.) :: (b1 -> c1) -> (a1 -> b1) -> a1 -> c1
map (:) :: [a2] -> [[a2] -> [a2]]
foldr (++) :: [a3] -> [[a3]] -> [a3]

b1 ~ [a2]
c1 ~ [[a2] -> [a2]]
a1 ~ [a3]
b1 ~ [[a3]] -> [a3]

所以我明白了

(.) (foldr(++)) (map (:)) :: a1 -> c1 ~ [a3] ->  [[a2] -> [a2]]

但如果我向 GHCi 询问 :t (.) (foldr(++)) (map (:)) 我会得到 (.) (foldr(++)) (map (:)) :: [a] -> [[[a] -> [a]]] -> [[a] -> [a]]

这与我的结果不同,有什么帮助可以得出相同的结果吗?

谢谢,
塞巴斯蒂安。

【问题讨论】:

    标签: haskell types ghci unification


    【解决方案1】:

    在最后一步中,您混合了参数 oder。你把b1 -> c1map (:)的类型统一起来,但是你应该把它和foldr (++)的类型统一起来。

    更一般地,您可能想学习如何自己调试这些复杂的计算。最好在最后进行完整性检查(在这种情况下,通过使用 ghci 检查结果)。如果健全性检查不起作用,下一步可以说或写下每个步骤是什么以及为什么这样做。在这种情况下,您会说“然后我将b1 -> c1map (:) 的类型统一起来,因为...”,您会在那里找到错误,因为没有理由这样做。

    也许rubber duck debugging 对你有用,你向橡皮鸭解释你的代码,通过解释,你会发现代码有什么问题。 .

    【讨论】:

      【解决方案2】:

      我不太确定,但我认为您错过了为 b1 生成两个约束的事实,因为在组合 f . g 中,g 的输出必须匹配 f 的输入.从这个事实出发,然后替换输入和输出,可以更容易地推断出组合的类型:

      map (:)              :: [a] -> [[a] -> [a]]
      foldr (++)           ::        [b         ] -> [[b         ]] -> [b         ]
      
      [b] ~ [[a] -> [a]]
       b  ~  [a] -> [a]
      
      foldr (++) . map (:) :: [a]                 -> [[b         ]] -> [b         ]
                            ~ [a]                 -> [[[a] -> [a]]] -> [[a] -> [a]]
      

      【讨论】:

        猜你喜欢
        • 2014-06-18
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-09
        相关资源
        最近更新 更多