【问题标题】:Figuring out type declaration for HOF in Haskell在 Haskell 中找出 HOF 的类型声明
【发布时间】:2019-03-29 19:12:18
【问题描述】:

我正在复习考试,其中一个练习题要求编写类型声明

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

【问题讨论】:

  • 你对mystery :: [a] -> a -> [a]的想法是什么?查找类型比其他任何事情都更像是一种逻辑练习。如果你能解释清楚,你就可以找出哪里出错了。
  • “代码行中的什么可以告诉我在我的类型声明中考虑Bool?”对p 的调用用作保护中的谓词,它始终是Bool 类型。

标签: function haskell definition type-declaration


【解决方案1】:

以下是我们对 p 的了解:

  1. 它应用于一个值,所以它必须是一个函数。对于某些类型 t1t2,它的类型为 t1 -> 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多