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)
有什么区别2x和2*x?
是什么意思Num (t -> t1) => t1?
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.