我想了解下面的类型
Prelude> :t map(10$)
map(10$) :: Num (a -> b) => [a] -> [b]
答案 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" (操作员),没有必要把它们放在后面引号中。