【问题标题】:How I can solve this : One :: Num a => a -> Bool -> a in Haskell?我该如何解决: One :: Num a => a -> Bool -> a in Haskell?
【发布时间】:2021-11-19 01:37:32
【问题描述】:

定义具有以下类型签名的函数!

One :: Num a => a -> Bool -> a

One = ?

我不明白 Num 是如何成为 bool 并再次成为 Num 的。任何人都可以帮助我理解和解决它。

【问题讨论】:

  • 这意味着您必须编写一个函数,该函数接受一个数字和一个布尔值,并返回一个数字(与原始类型相同)。有很多方法可以编写这样的函数,但我不知道你被要求编写哪一个。
  • Num 参数不是Bool;它完全独立于它。 One 3 TrueOne 4 False 等是调用的示例。鉴于所有整数字面量都具有Num a => a 类型,因此定义任意数量的忽略这两个参数的函数返回任何您喜欢的数字是很简单的。

标签: function haskell types


【解决方案1】:

Num 如何成为布尔值并再次成为 Num。任何人都可以帮助我理解这一点。

好吧,如果类型中的分组在左侧,就会出现这种情况,就像这样

one :: Num a => (a -> Bool) -> a

但实际上,分组在右边:

one :: Num a => a -> (Bool -> a)

所以我们需要找到一种方法将a 类型值转换为将Bool 值转换为a 类型值的方法。

既然我们将拥有这个 a 类型值,我们可以直接返回它:

one a = two 
  where
  two b = a

请注意,我必须将 One 更改为 oneOne 在语法上是 Haskell 中的一个类型,one 是一个类型的值。你显示的。

所以我们在这里所做的是定义值one,它具有这种类型。或者在 Haskell 中,

one :: a -> (Bool -> a)

但是等等,Num a => 约束去哪儿了?我们根本没有使用它,这就是为什么我们只能返回a

但是,a 成为Num 意味着什么?

GHCi> :i Num

class Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a

那么,任何Num 都有绝对值,并且可以被否定。因此一个可能的定义是

one :: Num a => a -> (Bool -> a)
one a = two
  where
  two b | b      = negate a
        | otherwise = abs a

【讨论】:

  • 我试过这个,但它不起作用 f2 :: Num a => a -> Bool -> a f2 x = one where one = x
  • 你为什么要这么做?那是我在回答中写的吗?你看完我的全部答案了吗?
  • 你能不能写个例子,因为我还是不明白。
  • 我已经做到了。它在答案中。你是如何“尝试”这个的?在 GHCi 中?您应该将源文件加载到其中。
  • 例如one 1 True, one (-2) (1>2).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多