我了解到可以通过两种方式调用函数:前缀和中缀。例如,说我创建了这个函数:
example :: [Char] -> [Char] -> [Char]
example x y = x ++ " " ++ y
Run Code Online (Sandbox Code Playgroud)
我可以这样称呼它为前缀:
example "Hello" "World"
Run Code Online (Sandbox Code Playgroud)
或像这样的中缀:
"Hello" `example` "World"
Run Code Online (Sandbox Code Playgroud)
两者都会导致代表字符串的字符列表"Hello World"。
但是,我现在正在学习函数组成,并且遇到了如下定义的函数:
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
所以,说我想乘以三来求和。我会像这样写前缀调用:
negateComposedWithMultByThree = (.) negate (*3)
Run Code Online (Sandbox Code Playgroud)
和infix调用类似:
negateComposedWithMultByThree = negate `(.)` (*3)
Run Code Online (Sandbox Code Playgroud)
但是,虽然前缀调用可以编译,但infix调用却不会,而是显示错误消息:
错误:解析输入'('
看来,为了调用compose infix,我需要省略方括号并这样称呼它:
negateComposedWithMultByThree = negate . (*3)
Run Code Online (Sandbox Code Playgroud)
谁能对此有所启示?为什么"Hello" `example` "World"同时negate `(.)` (*3)不?
另外,如果我尝试使用这样的签名来实现自己的功能:
(,) :: Int -> Int …Run Code Online (Sandbox Code Playgroud) 如何找出运算符“ +”的类型?说运算符+不是函数。
诸如此类的运算符的+ 行为更像是什么,
用话务员的话说#,我#不是那样(#)。(#)是咖喱函数,并且如果#表现得像咖喱函数,我猜没有必要了(#),不是吗?
谢谢。