使用不同的组合器(.)可以使无点函数更具可读性吗?

Rum*_*mca 11 haskell pointfree

什么是无边表达的潜在替代表示(例如使用箭头,镜头,Haskell习语,做语法),这些表达式可以更像简单的英语?

这是一个简单的例子:

qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)
Run Code Online (Sandbox Code Playgroud)

QName 来自的记录 Text.Xml

什么可能相当于qNameIs但不是有意义的表达?理想情况下,那些会显示第一个参数将被传递给(==)结果的结果将被评估,结果qName应用于该表达式的第二个参数?

Ste*_*lla 8

您可以使用模块Data.Function.Pointless.^运算符:

import Data.Function.Pointless (.^)

qNameIs :: String -> QName -> Bool
qNameIs = (==) .^ qName
Run Code Online (Sandbox Code Playgroud)

箭头的例子(它不优雅......):

qNameIs :: String -> QName -> Bool
qNameIs = curry $ uncurry (==) . second qName
Run Code Online (Sandbox Code Playgroud)

您还可以编写一个新的运算符:

with :: (a -> c -> d) -> (b -> c) -> a -> b -> d
with f g = (. g) . f
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

qNameIs = (==) `with` qName
Run Code Online (Sandbox Code Playgroud)

可以读作"与qName相等"(您也可以使用另一个运营商名称).

一般来说,你还应该看看模块Data.Composition(不幸的是,它对你的情况没有帮助......).