相关疑难解决方法(0)

Haskell:如何手动推断表达式的类型

给出了Haskell函数:

head . filter fst
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何手动"手动"找到类型.如果我让Haskell告诉我我得到的类型:

head . filter fst :: [(Bool, b)] -> (Bool, b) 
Run Code Online (Sandbox Code Playgroud)

但是我想了解它是如何工作的,只使用已定义如下的已使用函数的签名:

head :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
filter :: (a -> Bool) -> [a] -> [a]
fst :: (a, b) -> a
Run Code Online (Sandbox Code Playgroud)

编辑:这么多很好的解释......选择最好的一个并不容易!

haskell types type-inference unification

13
推荐指数
4
解决办法
1955
查看次数

如何手动推断'(.)的类型.(.).(.)"?

在Edward Kmett的演讲中,Lenses,Folds和Traversals,在幻灯片"The Power is the Dot"中,他展示的(.) . (.) . (.)

(a -> b) -> (c -> d -> e -> a) -> c -> d -> e -> b

我可以通过在GHCI中显示它的类型来看到它.但我也想知道原因.我想了解的另一件事是为什么有在从参数中经常换着花样(.)(.) . (.)(.) . (.) . (.):

(.)             :: (a -> b) -> (c ->           a) -> c ->           b
(.) . (.)       :: (a -> b) -> (c -> d ->      a) -> c -> d ->      b
(.) . …
Run Code Online (Sandbox Code Playgroud)

haskell types type-inference combinators function-composition

6
推荐指数
2
解决办法
215
查看次数