gpt4 book ai didi

Haskell,句法减少括号

转载 作者:行者123 更新时间:2023-12-02 08:07:39 25 4
gpt4 key购买 nike

我知道无意义的代码,但试图在我的大脑中留下类型类等内容。

问题:如何去掉下面函数中的括号?如果我在任何地方使用它,“$”都会引发错误。

data Vector = Vector XY XY deriving (Show)
data XY = XY (Float , Float) deriving (Show)
vector (Vector (XY (x1,y1)) (XY(x2,y2))) = [(x1,y1),(x2,y2)]

最佳答案

$ 运算符

$ 不是 Haskell 语法的一部分。它是一个内置的运算符 ($) :: (a -> b) -> a -> b运算符定义为 inxfixr 0 并实现:

($) :: (a -> b) -> a -> b
($) f x = f x

因此它以函数 f 和值 x 作为输入,基本上返回应用于 xf >。因为它有优先级 0,这意味着它的绑定(bind)非常低,因此如果你写

f . g $ x + 2

你实际上写:

($) ((.) f g) ((+) x 2)

这是以下的详细形式:

((.) f g) ((+) x 2)

或:

(f . g) (x + 2)

所以它可以用作“技巧”来强制 Haskell 自己添加括号。由于它是一个运算符,而不是语法的一部分,因此它不适用于类型签名、模式、派生子句等其他位置。

当然,运算符还有其他用途。例如,我们可以在其他高阶函数中使用它(比如 zipWith ($) 接受函数列表 [f1, f2, ...] 和一个列表值 [x1, x2, ...] 并返回一个列表 [f1 x1, f2 x2, ...])。

最小化括号的数量

但是我们可以尽量减少括号的数量。例如,如果您只派生一个单个类型类,deriving 子句不需要需要括号,所以我们可以这样写:

data Vector = Vector XY XY deriving Show
data XY = XY (Float , Float) deriving Show

此外,在函数声明中,您解压元组,然后重新打包元组元素回到基本相同的元组中。我们可以通过绑定(bind) XY 构造函数的内容来减少表达式(并减少解包和重新打包的数量):

vector (Vector (XY xy1) (XY xy2)) = [xy1, xy2]

关于Haskell,句法减少括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50098745/

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