我正在审查考试,并且其中一个实践问题要求编写类型声明
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
?
答案 0 :(得分:7)
这是我们对p
的了解:
t1 -> t2
和t1
,其类型为t2
。head x
。由于您已经确定x :: [a]
,因此确定head x :: a
。这意味着t1 ~ a
,所以p :: a -> t2
。p (head x)
用于期望布尔值的上下文,因此p (head x) :: Bool
。这意味着t2 ~ Bool
,所以p :: a -> Bool
。QED。