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中的每一步,看看你的(等式)推理是否正确.
一些预防措施:
GHCi总是试图推断出最一般的签名 - 所以如果你期望的话
foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)然后在晚于7.8的GHC版本中,您将看到我在上面写的签名.
type所以如果你有一个-ALIASES可能会造成混乱type MyAB a b = (a -> b -> b),然后foldr :: MyAB a b -> b -> [a] -> b是一个正确的专业化,但是你可能不会看到这个GHCI.