Rum*_*mca 11 haskell pointfree
什么是无边表达的潜在替代表示(例如使用箭头,镜头,Haskell习语,做语法),这些表达式可以更像简单的英语?
这是一个简单的例子:
qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)
Run Code Online (Sandbox Code Playgroud)
QName
来自的记录 Text.Xml
什么可能相当于qNameIs
但不是有意义的表达?理想情况下,那些会显示第一个参数将被传递给(==)
结果的结果将被评估,结果qName
应用于该表达式的第二个参数?
您可以使用模块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(不幸的是,它对你的情况没有帮助......).