2x和2 * x之间有什么区别吗?

时间:2016-11-06 04:25:52

标签: haskell

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

2x2*x之间有什么区别吗?

Num (t -> t1) => t1是什么意思?

1 个答案:

答案 0 :(得分:6)

  

2x和2 * x之间是否有任何差异?

是。 2 * x是数字2乘以变量x2 x是将字面值2fromInteger 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等表达式提供机制。