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

ign*_*zzo -7 haskell

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

eps*_*lbe 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
Run Code Online (Sandbox Code Playgroud)

这些是涉及的基本类型.

现在,如果我们使用显式父级化,我们看到的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)
Run Code Online (Sandbox Code Playgroud)

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

此外,你可以看到id,那么起始值是b1 ~ (a2-> a2)如此替代,给我们:

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> (a2 -> a2)) -> (t a1 -> (a2 -> a2))
Run Code Online (Sandbox Code Playgroud)

并再次省略明确的parens

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> a2 -> a2) -> t a1 -> a2 -> a2
Run Code Online (Sandbox Code Playgroud)

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

一些预防措施:

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

  • type所以如果你有一个-ALIASES可能会造成混乱type MyAB a b = (a -> b -> b),然后foldr :: MyAB a b -> b -> [a] -> b是一个正确的专业化,但是你可能不会看到这个GHCI.