Haskell代码去括号咨询:消除函数括号并解决$运算符报错问题
如何消除Haskell函数模式匹配中的冗余括号?
嘿,我懂你这种练习时想简化代码的心情——这段代码里的括号确实有点繁琐,而且$在这里确实派不上用场,因为它的适用场景和模式匹配完全不搭。咱们来一步步把这些多余的括号干掉:
先贴一下你原来的代码方便对比:
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)]
方案一:从类型定义源头简化(最推荐)
你现在的XY类型把一个元组包在了构造器里,其实完全可以直接把两个Float作为构造器的参数,去掉内层的元组:
data XY = XY Float Float deriving (Show)
这样修改后,XY构造器直接接收两个独立的浮点数,不需要再套一层元组括号。对应的vector函数就能写成:
vector (Vector (XY x1 y1) (XY x2 y2)) = [(x1,y1), (x2,y2)]
是不是清爽多了?原来(x1,y1)外面的括号直接就消失了,因为现在XY的参数不是元组,是两个单独的值。
方案二:不修改类型定义的简化方式
要是你不想改动XY的定义,也可以通过更简洁的模式匹配来减少括号:
- 如果你不需要单独提取
x1、y1,直接保留元组的话,可以写成:vector (Vector (XY xy1) (XY xy2)) = [xy1, xy2] - 如果还是要拆分元组里的元素,那元组本身的括号是必须的(因为元组是一个整体),但可以保证格式整齐:
vector (Vector (XY (x1,y1)) (XY (x2,y2))) = [(x1,y1), (x2,y2)]
为啥用$会报错?
这里得说清楚:$是函数应用的语法糖,作用是降低右边表达式的优先级,让它作为左边函数的参数。但你现在是在模式匹配里解构参数,这是函数定义的语法,不是函数应用的场景,所以$在这里根本用不上,自然会触发语法错误。
总之,最彻底的简化方式就是调整XY的类型定义,去掉多余的元组包裹,这样模式匹配里的括号就能大幅减少啦!
内容的提问来源于stack exchange,提问作者Madderote
相关产品推荐
相关产品推荐

