什么是可能的替代表示(例如使用箭头,镜头,Haskell习语,做语法)的无点表达式,它们更像是简单的英语?
这是一个简单的例子:
qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)
QName
是来自Text.Xml
什么可能等同于qNameIs
而不是有意义的表达?理想情况下,那些会显示第一个参数将被传递给(==)
并且结果将被评估,结果为qName
应用于此表达式的第二个参数?
答案 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(不幸的是,它对您的情况没有帮助......)。