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

Aur*_*ier 4 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
Run Code Online (Sandbox Code Playgroud)

有什么区别2x2*x

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

Tho*_*son 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)
Run Code Online (Sandbox Code Playgroud)

它的用途:

*Main> (\x -> (2 :: Int -> Int) x) 5
10
Run Code Online (Sandbox Code Playgroud)

那里有更好的例子.IIRC,Lennart在SO上有一个提供诸如此类表达的机制2 seconds * 5 hours.