2011-08-27 14 views
7

私は通常はパターンマッチすることができます知っているが、時々私は、これらの機能が便利になります。左(または右)かどうかを聞くことができますか?

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

は、標準ライブラリのようなものはありますか?

+0

私は@ pyrospadeが受け入れられた答えになるはずだと思います。 – SwiftsNamesake

答えて

19

これはかなり古いものですが、参照用にここに投稿しています。

これは4.7以降Data.Either下の標準ライブラリになりました:指定された値は左値、そうでなければFalseであれば

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を返します。

3

いいえ、afaikはありません。

isLeft (Left _) = True 
isLeft _  = False 

同じ

はもちろん、 isRightのために行く:

しかし、あなたは*でも簡単にこれらの関数を定義することができます。

EDIT:*さて、私はありません

5

...それは簡単ですかどうかは、コードの複数行を必要とするので、それは、議論の余地だと思うが、あなたが書くことができます。

import Data.Either 

isLeft = null . rights . return 
isRight = null . lefts . return 
+2

おそらく、それは関数を定義するのはむしろ単純ではない方法なので。 「どちらか」の定義やパターンマッチングを使用すると、おそらく理解が容易になるでしょう。 –

+0

できます。私は、「どちらかの」機能が利用可能な機能がほとんどないことに少し失望しています。私は少なくとも 'leftMaybe ::どちらかa b a>たぶんa'とそれに相当するものを期待しています。 – Landei

2

を限り私は知っている、標準ライブラリにこれのようなものはない。しかし、あなたはそれを簡単に定義することができます。

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

isLeft (Left _) = True 
isLeft _  = False 

isRight (Right _) = True 
isRight _   = False 
+2

OPは、isLeftとisRightが標準ライブラリ内に異なる名前であるかどうかを知りたいと思っています。彼は、標準ライブラリで*どちらかであるかのどちらかですでに定義できることを知っています。 – dave4420

+3

同様の回答に-1がないため、これを+1しました。彼は質問に答えました。 – alternative

13

人々が指摘しているように、標準ライブラリにはそのような機能はなく、さまざまな方法で独自の機能を実装することができます。

ただし、という形式の質問は、「標準ライブラリにはXがありますか?」という質問に注意してください。 ファンクションの名前がわからなくても、タイプで検索することができます。は、Hoogleによって最も簡単に回答されます。

Hoogleも、引数の順序は重要ではないことを知るには十分にスマートで、タイプが検索したタイプと類似している(より一般的な)結果も表示されます。

この場合、Either a b -> Booldoes not yield any promising matchesを検索すると、標準ライブラリには存在しないことがわかります。

+1

Hoogleのアドバイスはまだまだですが、標準ライブラリ*にはこのような機能があります。 [この質問に対する他の回答](http://stackoverflow.com/a/24046158/1126841)を参照してください。 – chepner

関連する問題