在Haskell中找出HOF的类型声明

时间:2019-03-29 19:12:18

标签: function haskell definition type-declaration

我正在审查考试,并且其中一个实践问题要求编写类型声明

mystery :: ---complete here---- 
mystery x p
    | p (head x) = tail x
    | otherwise  = head x : mystery (tail x) p

不看答案,我认为谜题类型为:

mystery:: [a] -> a -> [a]

但是当我查看要比较的解决方案时:

mystery:: [a] -> (a -> Bool) -> [a]

为什么a -> Bool?以及代码行中的哪些内容可以告诉我在类型声明中考虑Bool

1 个答案:

答案 0 :(得分:7)

这是我们对p的了解:

  1. 它应用于值,因此它必须是一个函数。对于某些类型t1 -> t2t1,其类型为t2
  2. 它专门应用于head x。由于您已经确定x :: [a],因此确定head x :: a。这意味着t1 ~ a,所以p :: a -> t2
  3. p (head x)用于期望布尔值的上下文,因此p (head x) :: Bool。这意味着t2 ~ Bool,所以p :: a -> Bool

QED。