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

时间:2014-04-04 20:07:09

标签: haskell pointfree

什么是可能的替代表示(例如使用箭头,镜头,Haskell习语,做语法)的无点表达式,它们更像是简单的英语?

这是一个简单的例子:

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

QName是来自Text.Xml

的记录

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

1 个答案:

答案 0 :(得分: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(不幸的是,它对您的情况没有帮助......)。

相关问题