是否有一种简洁的方法来更改函数的返回类型?
在comparing
中考虑例如 Data.Ord
。它返回Ordering
。然而,我只对这两个项目是否相同感兴趣。因此,我需要将生成的Ordering
转换为Bool
。
我能想到的一个直接的方法是:
isEqualOn f x y = if comparing f x y==EQ then True else False
(或评论中指出的isEqualOn f x y = comparing f x y==EQ
)。
是否有更多的组合方式来做到这一点(有点适应comparing
或以无意义的方式编写它)而不必写出所有内容?理想情况下,我也在寻找适用于n-ary函数的东西。
- 更新 -
根据答案/评论的建议,上面的具体示例(isEqualOn
)可以使用标准on
函数on (==)
来实现。但是,我的问题是关于以组合/无意义方式更改函数返回类型的一般技术,如评论中的SEC方法所示。
答案 0 :(得分:5)
您对isEqualOn
的定义与on (==)
相同:
\> import Data.Function (on)
\> :t (on (==))
(on (==)) :: Eq a1 => (a -> a1) -> a -> a -> Bool
例如比较绝对值:
\> let isEqualOn = on (==)
\> isEqualOn abs 2 (-2)
True
答案 1 :(得分:0)
如前所述,您可以使用Data.Function中的函数on
,但是
也许您正在寻找返回==
的运算符Bool
。
在这种情况下,您的函数可以写为:
isEqualOn f x y = fx == fy
并且我个人永远不会写这个特殊功能但是 “内联”它在哪里使用。
关于“改变回归类型”的更一般性问题。您正在寻找的是组合:
isEq Eq = True
isEq _ = False
equal x y = isEq (comparing x y)
或更多haskell风味:
equal x = isEq . comparing x