8

我知道我通常可以只进行模式匹配,但有时我会发现这些函数很有用:

isLeft  = either (const True) (const False)
isRight = either (const False) (const True)

标准库中有类似的东西吗?

4

5 回答 5

24

虽然这很旧,但在这里发布以供参考。

这现在在Data.Either自 4.7 以来的标准库中:

https://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Either.html

isLeft :: Either a b -> Bool

如果给定值是左值,则返回 True,否则返回 False。

isRight :: Either a b -> Bool

如果给定值是右值,则返回 True,否则返回 False。

于 2014-06-04T19:41:52.073 回答
13

正如人们一直指出的那样,标准库中没有这样的功能,您可以通过各种方式实现自己的功能。

但是,请注意“X 在标准库中吗?”形式的问题。Hoogle最容易回答,因为即使您不知道函数的名称,您也可以通过它的类型搜索它。

Hoogle 也很聪明,知道参数顺序无关紧要,它还会显示类型与您搜索的类型相似(例如更通用)的结果。

在这种情况下,搜索Either a b -> Bool 不会产生任何有希望的匹配项,因此这是一个很好的指标,表明它在标准库中不存在。

于 2011-08-27T13:51:11.277 回答
5

不,但你可以写:

import Data.Either

isLeft = null . rights . return
isRight = null . lefts . return
于 2011-08-27T09:04:28.833 回答
3

不,没有,afaik。

但是您可以更轻松地定义这些函数*:

isLeft (Left _) = True
isLeft _        = False

当然,同样如此isRight

编辑:*好吧,我想这是否更容易是有争议的,因为它需要更多的代码行......

于 2011-08-27T08:43:24.797 回答
2

据我所知,标准库中没有这样的东西。但是,您可以轻松地自己定义它。

either l _ (Left  a) = l a
either _ r (Right b) = r b

isLeft (Left _) = True
isLeft _        = False

isRight (Right _) = True
isRight _         = False
于 2011-08-27T09:36:54.920 回答