如何向Haskell三参数函数优先传递第二个参数?
Haskell中优先传递中间参数的优雅实现
先看你给出的原函数:
minus :: Int -> Int -> Int -> Int minus x y z = x - y - z
要优先固定y参数(比如固定为10),同时避免显式定义新函数,有两种简洁的写法:
1. 使用Lambda表达式
直接用匿名函数绑定参数,无需命名新函数,在需要的地方直接使用:
-- 直接得到接受x和z的函数 \x z -> minus x 10 z
如果需要复用,也可以简洁绑定:
minusY10 = \x z -> minus x 10 z
2. 使用flip函数结合部分应用
利用flip交换函数前两个参数的特性,结合柯里化实现更优雅的写法:
-- flip minus 会将参数顺序转为 y -> x -> z -> Int -- 传入10后,得到 x -> z -> Int 的函数,效果等价于 minus x 10 z minusY10 = flip minus 10
flip的类型是(a -> b -> c) -> b -> a -> c,对于柯里化的三元函数,它会交换最外层的两个参数,刚好满足你优先传递y的需求。
内容的提问来源于stack exchange,提问作者PengHX
相关产品推荐
相关产品推荐

