从控制台获取Haskell中的`flip foldr id`类型

时间:2016-07-09 19:48:22

标签: haskell

如何从控制台获取函数类型(flip foldr id)?

2 个答案:

答案 0 :(得分:10)

实际上在haskell中没有任何猜测,最好在GHCi的帮助下坐下来工作。

所以,让我们最好开始并启动ghci

$ > ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t foldr
foldr :: Foldable t => (a1 -> b1 -> b1) -> b1 -> t a1 -> b1
Prelude> :t id
id :: a2 -> a2

这些是涉及的基本类型。

现在,如果我们使用显式父级化,我们会看到foldr :: Foldable t => (a -> b -> b) -> b -> (t a -> b)是一个带有折叠函数和返回函数的起始值的函数。

由于类型级别的所有小写字母都是(类型)变量,我们可以开始替换

foldr :: Foldable t => (a1 -> b1 -> b1) -> b1 -> t a1 -> b1
                        **************     **    **********
flip ::                (     a          -> b  ->    c   ) -> ( b  ->       a          ->     c      )
                                                              ***     **************      **********
flip foldr :: Foldable t =>                                    b1 -> (a1 -> b1 -> b1) -> (t a1 -> b1)

请注意您已插入flip函数的第一个参数 - 因此它不再显示在类型签名中。

此外,你可以看到id是起始值,所以b1 ~ (a2-> a2)所以替换它给我们:

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> (a2 -> a2)) -> (t a1 -> (a2 -> a2))

再次省略明确的parens

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> a2 -> a2) -> t a1 -> a2 -> a2

这个程序的优点是什么 - 你可以检查GHCi中的每一步,看看你的(等式)推理是否正确。

一些预防措施:

  • GHCi总是试图推断出最常见的签名 - 所以如果你期望

    foldr :: (a -> b -> b) -> b -> [a] -> b
    

然后在晚于7.8的GHC版本中,您将看到我在上面写的签名。

  • type - 别名可能会造成混淆,所以如果您有type MyAB a b = (a -> b -> b),那么foldr :: MyAB a b -> b -> [a] -> b是正确的专业化,但您可能无法在GHCi中看到这一点。

答案 1 :(得分:3)

您可以使用:t中的ghci命令查找任何表达式的类型。

GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> :t flip foldr id
flip foldr id
  :: Foldable t => (a -> (a1 -> a1) -> a1 -> a1) -> t a -> a1 -> a1