如何阅读以下haskell定义"数字(a - > b)=> [a] - > [b]"

时间:2016-11-14 15:31:58

标签: haskell types

我想了解下面的类型

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

2 个答案:

答案 0 :(得分:4)

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

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

特别是Num,“被视为数字”通常只意味着你在一个地方写了一个数字文字。一个功能是预期的。 (10$)部分希望10成为一个函数。因为Haskell数字文字是多态的,所以它本身并没有错:10 可以只有它具有合适的instance Num (a -> b)才能成为函数。只是,这个实例不存在,但是因为有些人原则上可以在以后添加它,所以编译器将其作为要实现的约束。

答案 1 :(得分:3)

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

在Haskell中,数字文字的类型为Num a => a,意思是任何类型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" (操作员),没有必要把它们放在后面引号中。