在Haskell中更改函数的返回类型?

时间:2016-01-13 22:41:37

标签: haskell

是否有一种简洁的方法来更改函数的返回类型?

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方法所示。

2 个答案:

答案 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