gpt4 book ai didi

haskell - 括号可以用$代替吗?

转载 作者:行者123 更新时间:2023-12-02 16:31:25 27 4
gpt4 key购买 nike

我有以下功能:

digits :: Int -> [Int]
digits n = go n []
where go num acc
| num < 10 = num : acc
| otherwise = go (div num 10) (mod num 10 : acc)

是否可以将otherwise表达式中的括号替换为$

最佳答案

问题

您不能使用 $ 来实现此目的。 $ 的目的是使函数应用程序绑定(bind)尽可能不紧密,而不是绑定(bind)最紧密的普通函数应用程序,

> :i $
($) :: (a -> b) -> a -> b
infixr 0 $

(删除了一些不相关的内容...)

这里,infixr 表示该运算符是右结合,与 infixl 不同,infixl 表示该运算符是l ef 联想。 0 表示运算符的优先级。 0 结合最不紧密,9 结合最紧密。

如果我们写成 go $ div num 10 $ mod num 10 : acc,这会被解释为 go (div num 10 (mod num 10 : acc)),即:传递 mod num 10 : acc 作为 div 的第三个参数,以及将 div 应用为 的唯一参数的结果去

解决方案:(&) 运算符

您可以使用 &,而不是在左侧使用美元符号 $

> :i &
(&) :: a -> (a -> b) -> b -- Defined in `Data.Function'
infixl 1 &

现在我们得到:

import Data.Function ((&))

digits :: Int -> [Int]
digits n = go n []
where go num acc
| num < 10 = num : acc
| otherwise = div num 10 & go $ mod num 10 : acc

解决方案:应用go中缀

您还可以使用 go 中缀:

digits :: Int -> [Int]
digits n = go n []
where go num acc
| num < 10 = num : acc
| otherwise = div num 10 `go` (mod num 10 : acc)

在这种情况下,由于 (:) 也是中缀并干扰 go,因此需要右侧的括号。

使用哪种解决方案

在我看来,如果您可以使用不带括号的中缀应用程序,那就这样做。如果任何一侧都有括号,例如:div num 10 `go` (mod num 10 : acc),仍然可以保证使用中缀。这主要是出于可读性的考虑,因为普通读者可能不熟悉 &。这种表示法(可能)不太常用,这就是为什么普通读者不太熟悉它(所以我们有一个循环......)。

关于$$的使用

我相信 Alexey Romanov 的运算符 $$ 也非常简洁。不幸的是,它遇到了与 & 相同的问题:缺乏熟悉度。希望他的运算符能够在适当的时候添加到 Data.Function 中,也许我们可以扩展我们的工具箱。

关于haskell - 括号可以用$代替吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com