我想了解为什么以下是Haskell中的有效表达式:
Prelude> let e = (+) (-)
Prelude> :type e
e :: (Num (a -> a -> a), Num a) => (a -> a -> a) -> a -> a -> a
Run Code Online (Sandbox Code Playgroud)
更奇怪的是表格中的任何表达
e 1 2 3 4 ... N
Run Code Online (Sandbox Code Playgroud)
无论N都是不可理解类型的有效表达式.例如,
Prelude> :t e 1 2 3 4 5
e 1 2 3 4 5
:: (Num ((a -> a1 -> t) -> (a -> a1 -> t) -> a -> a1 -> t),
Num (a -> a1 -> t), …Run Code Online (Sandbox Code Playgroud) 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 …
使用$ in Learn You Haskell书中的阅读函数应用程序我找到了将$应用于函数列表的示例.
map ($ 3) [(4+), (10*), (^2), sqrt]
Run Code Online (Sandbox Code Playgroud)
我想尝试类似的东西并减少应用于一个功能的例子
fmap ($ 3) (4+)
Run Code Online (Sandbox Code Playgroud)
但我得到的错误是我不明白的
• Non type-variable argument in the constraint: Num (a -> b)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a b. (Num (a -> b), Num a) => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
你能帮我理解为什么它在第一种情况下起作用但它不在第二种情况下吗?我怎样才能达到预期的效果?
谢谢
haskell ×3