为什么(.)类型为 ((a -> [c]) -> a -> c)的头部?

4
我在GHCi中尝试了:t (.) head,得到了结果(a -> [c]) -> a -> c。我对此感到非常困惑。有人能给我一个提示来帮助我理解吗?
根据我的思考,结果应该是([a] -> a -> c) -> a -> c

7
你认为为什么它应该是([a] -> a -> c) -> a -> c - leftaroundabout
2个回答

8

提示:

(.) head 
= \f   -> (.) head f
= \f   -> head . f 
= \f a -> head (f a)

一旦你掌握了这个,其他就跟着来了:
  • head :: [c] -> c
  • f :: a -> b - 因此当我们执行 head . f 时,必须有 b = [c]
现在整个表达式变成了:
\     f              a        -> head (f a)
:: (a -> [c])     -> a        -> c
      ^ type of f    ^ the a     ^ result of head (f a)

2
head     ::  [n] -> n
--   b ~ [n]  |     | c ~ n
--            |     |
(.)      ::  (b  -> c) -> (a ->  b ) -> a -> c

(.) head ::               (a -> [n]) -> a -> n

-- rename n to c:         (a -> [c]) -> a -> c

谢谢,我是Haskell的新手,进一步问题是为什么head被指定为(b->c),而不是(a->b)? - Nostaglia
如果问题是成功的,但是出现了类型或错误,我该如何改进它?谢谢。 - Nostaglia
@Nostaglia 因为这是 (.) 的第一个参数。 - user253751

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接