【问题标题】:How to read the following haskell definition " Num (a -> b) => [a] -> [b] "如何阅读以下haskell定义“ Num (a -> b) => [a] -> [b] ”
【发布时间】:2016-11-14 15:31:57
【问题描述】:

我试图理解下面的类型

Prelude> :t map(10$)
map(10$) :: Num (a -> b) => [a] -> [b]

【问题讨论】:

  • 你对它有什么理解?你有什么难以理解的地方?
  • 在这种情况下无法理解 Num(a-> b) 的含义?函数类型的 Num 实例?我最近开始学习haskell,到目前为止我看到了 Num 一个类型但没有看到 Num (函数)。
  • (10 $) 是一个函数,(10 $) x = 10 $ x = 10 x。这要求10a -> b 类型,因为一般函数应用是(f :: a -> b) (x :: a) :: b。在 Haskell 中,数字文字的类型为 Num a => a,这意味着 any 类型为 a,它是 in 类型类 Num。因此(10 $) 的类型必须是(Num a) => (a -> b)。事实上,这不是一个普遍的情况。您可能不是想让10 用作函数。
  • 你是对的@WillNess,我的意思是 10 作为一个函数,我只是想了解 map 函数和美元运算符如何在不同的组合中工作。谢谢
  • @duplode 我尝试了很多来查找有关 ($) 的文档,但没有运气,如果您能指出我将不胜感激。非常感谢

标签: haskell types


【解决方案1】:

如何理解Num (a->b) 这样的约束? 可以更一般地回答:如何理解Num SomeCompoundType

很简单,这样的约束意味着您试图将一个类型视为数字类型,尽管它不是数字类型。这样的类型只是伪造的,尽管它不是类型错误(理论上,有人可以添加一个Num (a -> b) 实例)。

尤其是Num,“视为一个数字”通常只是意味着您在一个地方写了一个数字文字,例如需要一个函数。 (10$) 部分希望 10 成为一个函数。因为 Haskell 数字文字是多态的,这本身并没有什么问题:10 可以 是一个函数,只要它有合适的 instance Num (a -> b)。只是,这个实例不存在,但是因为原则上有人可以稍后添加它,编译器将其保留为要实现的约束。

【讨论】:

    【解决方案2】:

    (10 $) 是一个函数,(10 $) x = 10 $ x = 10 x。这要求10a -> b 类型,因为通用函数应用程序是(f :: a -> b) (x :: a) :: b

    在 Haskell 中,数字文字的类型为 Num a => a,意思是 any 类型为 a,它类型类 Num

    因此(10 $) 的类型必须是(Num a) => (a -> b)。事实上,这种情况并不常见。您可能不是想让10 用作函数。

    另一方面,($ 10) x = x $ 10 = x 10。这被称为“操作员部分”:(a `op` b) = (a `op`) b = (`op` b) a = op a b。当特殊字符($: 等)用作“op”(运算符)时,无需将它们放在反引号内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多