我正在审查考试,其中一个练习题是要求写出类型声明
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
?
以下是我们对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。