如何从控制台获取函数类型(flip foldr id
)?
答案 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