Prelude> :t fmap (\x -> 2x) []
fmap (\x -> 2x) [] :: Num (t -> b) => [b]
Prelude> :t fmap (\x -> 2 * x) []
fmap (\x -> 2 * x) [] :: Num b => [b]
Prelude> :t 1 1
1 1 :: (Num (t -> t1), Num t) => t1
Prelude> :t 1 * 1
1 * 1 :: Num a => a
2x
和2*x
之间有什么区别吗?
Num (t -> t1) => t1
是什么意思?
答案 0 :(得分:6)
2x和2 * x之间是否有任何差异?
是。 2 * x
是数字2
乘以变量x
。 2 x
是将字面值2
(fromInteger 2
)解释为变量x
而生成的函数的结果。
2
如何成为一个功能?好吧,如果你有一个实例Num (t -> t1)
,那么你可以解释2 :: t -> t1
,它肯定是一个功能。虽然这是可能的,但是没有常用的库具有这样的Num实例。基本上,每当你看到这样的类型签名弹出时,都是由于语法错误。
编辑:
就像一个无聊的例子:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
instance (Num a) => Num (a -> a) where
fromInteger n = \x -> ((fromInteger n) * x)
及其用途:
*Main> (\x -> (2 :: Int -> Int) x) 5
10
有更好的例子。 IIRC,Lennart在S.O.为2 seconds * 5 hours
等表达式提供机制。