是否可以使用不同的组合子来使点无函数更易读,而不是使用 (.)?涉及到 IT 技术。

11

有哪些潜在的替代表示方法(例如使用箭头、镜头、Haskell惯用语、do语法)可以使无参考表达式更容易读懂,看起来更像英语?

下面是一个简单的例子:

qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)

QName 是来自于 Text.Xml 的一条记录。

有哪些可能等价于 qNameIs 但不是 pointful expressions 的表达式呢?理想情况下,这些表达式应该能够显示第一个参数将被传递给 (==) 并且结果将被计算,而该结果应用于这个表达式的第二个参数作为 qName 的结果。


2
我经常用>>>代替.,因为从左到右的顺序似乎更自然 - 我猜这是因为它遵循了我们在英语中习惯的顺序,并且这是我们在其他语言中创建管道的典型方式。 - Mark H
4
请参见语义编辑组合器 - Daniel Wagner
你所拥有的是 (==) <*> qName - Will Ness
1个回答

8
你可以使用 Data.Function.Pointless 模块的 .^ 运算符:
import Data.Function.Pointless (.^)

qNameIs :: String -> QName -> Bool
qNameIs = (==) .^ qName

一个带箭头的例子(它不太优雅...):
qNameIs :: String -> QName -> Bool
qNameIs = curry $ uncurry (==) . second qName

你也可以编写一个新的操作符:

with :: (a -> c -> d) -> (b -> c) -> a -> b -> d
with f g = (. g) . f

然后你可以写:
qNameIs = (==) `with` qName

可以读作“与qName相等”(您也可以选择其他运算符名称)。

通常,您还应该查看模块Data.Composition(不幸的是,在您的情况下它没有帮助...)。


也许这更清楚地展示了参数的应用,但它并没有真正读起来“更像普通英语”。 - Two-Bit Alchemist
是的,你说得对...我也得先检查一下我的答案,我觉得它不正确... - Stephan Kulla
1
弱建议:flip $ (==) . qName - 不像英语,但比(.)部分更透明。 - duplode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接