在Haskell中找出HOF的类型声明

问题描述 投票:0回答:1

我正在审查考试,其中一个练习题是要求写出类型声明

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

function haskell definition type-declaration
1个回答
7
投票

以下是我们对p的了解:

  1. 它应用于一个值,因此它必须是一个函数。这使得t1 -> t2类型为t1t2
  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。

© www.soinside.com 2019 - 2024. All rights reserved.