相关疑难解决方法(0)

为什么(。)称为中缀。而不是`(。)`

我了解到可以通过两种方式调用函数:前缀和中缀。例如,说我创建了这个函数:

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)

haskell

2
推荐指数
1
解决办法
137
查看次数

运算符(例如+)的行为是否更像咖喱函数或带有成对元组类型参数的函数?

如何找出运算符“ +”的类型?说运算符+不是函数。

诸如此类的运算符的+ 行为更像是什么,

  • 咖喱函数,或
  • 一个参数具有成对元组类型的函数?

用话务员的话说#,我#不是那样(#)(#)是咖喱函数,并且如果#表现得像咖喱函数,我猜没有必要了(#),不是吗?

谢谢。

haskell language-lawyer

1
推荐指数
2
解决办法
169
查看次数

标签 统计

haskell ×2

language-lawyer ×1