gpt4 book ai didi

haskell - 为什么(.)被称为infix。而不是 `(.)`

转载 作者:行者123 更新时间:2023-12-02 05:39:58 26 4
gpt4 key购买 nike

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

example :: [Char] -> [Char] -> [Char]
example x y = x ++ " " ++ y

我可以这样称呼它为前缀:
example "Hello" "World"

或像这样的中缀:
"Hello" `example` "World"

两者都将导致表示字符串 "Hello World"的字符列表。

但是,我现在正在学习函数组成,并且遇到了如下定义的函数:
(.) :: (b -> c) -> (a -> b) -> a -> c

所以,说我想乘以三来求和。我会像这样写前缀调用:
negateComposedWithMultByThree = (.) negate (*3) 

和infix调用类似:
negateComposedWithMultByThree = negate `(.)` (*3)

但是,虽然前缀调用可以编译,但是infix调用却不会,而是显示错误消息:

error: parse error on input `('



看来,要调用compose infix,我需要省略方括号,并这样称呼它:
negateComposedWithMultByThree = negate . (*3)

谁能对此有所启示?为什么 "Hello" `example` "World"而不是 negate `(.)` (*3)

另外,如果我尝试使用这样的签名来实现自己的功能:
(,) :: Int -> Int
(,) x = 1

它无法编译,并显示错误:

"Invalid type signature (,) : ... Should be of form :: "

最佳答案

这里没有深处。关于标识符的解析,只有两种标识符有不同的规则:by-default-infix和by-default-prefix。您可以知道是哪一个,因为默认前缀标识符仅包含标点符号,而默认前缀标识符仅包含数字,字母,撇号和下划线。

认识到默认值并不总是正确的选择,因此该语言提供了远离默认行为的转换。因此,有两种单独的语法规则,一种将默认的前缀标识符转换为前缀(添加括号),另一种将默认的前缀标识符转换为中缀(添加反引号)。您不能嵌套这些转换:转换为前缀形式的默认前缀标识符不是默认前缀标识符。

而已。根本上没有什么有趣的-解析后它们全部成为函数应用程序-只是语法糖。

关于haskell - 为什么(.)被称为infix。而不是 `(.)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56960294/

26 4 0
文章推荐: SVN更新: 'skipped' message
文章推荐: java - 特殊的 GUI 问题
文章推荐: Java泛型方法
文章推荐: java - EJB 和 WatchService
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com