1
A
答えて
3
Int
がバインドされているため、Enum
のみで平等テストを行うには不十分です。私たちが次のような機能を持っていたとしましょう。
eqEnum :: Enum a => a -> a -> Bool
eqEnum x y = fromEnum x == fromEnum y
今、私たちは一致していない2 Integer
を生成することができます
ghci> eqEnum 0 (2 + 2 * toEnum (maxBound :: Int))
True
またDouble
をチェックすることができます。
ghci> eqEnum 3.0 pi
True
、おっと。 Enum
は、正しいEq
インスタンスを生成しません。私たちも、少しさらに行くとEq
インスタンスを持つことができないタイプのためEnum
のインスタンスを作成することができます。
newtype Foo = Foo { unFoo :: Integer -> Integer }
instance Enum Foo where
fromEnum (Foo f) = fromEnum $ f 0
toEnum n = Foo (+ toInteger n)
succ = Foo . succ . unFoo -- not necessary
pred = Foo . pred . unFoo -- not necessary
我々は機能F_n(x) = x + n
の家族を列挙している偽のインスタンスを使用することができます。
> map ((\f -> unFoo f 0) . toEnum) [0..100]
[0,1,2,...,100]
ただし、2つの関数が同じであるかどうかは判断できません。
ghci> toEnum . fromEnum $ pi :: Double
3.0
ghci> let f = toEnum . fromEnum $ Foo (const 0) :: Foo
ghci> unFoo f 0
0
ghci> unFoo f 1 -- not constant anymore
1
基本的な問題はEnum
は何の法律を持っていないということです。そして、それはDouble
であるとして、多くのFoo
toEnum . fromEnum
と、実際に回復不可能な値があります。からInt
に変換する必要があります。しかし、結局のところ、それはoriginally meant for [x..y]
(別名enumFromTo x y
)であることを示して、あまり驚くべきことではありません。
関連する問題
- 1. 2つの列挙型*の等価性の比較?
- 2. uint32_t型のC++の等価性が比較されない
- 3. fsharpのカスタム比較と等価性
- 4. 厳密な等価比較
- 5. スキームリスト等価比較
- 6. db2空の文字列等価比較
- 7. javaで列挙型を比較する
- 8. 列挙型の値を比較
- 9. SQLAlchemyオブジェクトインスタンスと属性の等価性の比較
- 10. mypyと比較可能な型
- 11. Javascriptでの等価性のNaN値の比較
- 12. Octave/MATLAB:構造体の等価性を比較するには?
- 13. Handlebar.java:#ifヘルパーでの等価比較
- 14. PHPアルゴリズム(緩い)等価比較
- 15. null可能な列挙型へのキャスト
- 16. for ...等価のための列挙型のテスト列
- 17. SQLサーバーの日付と日時の等価性の比較
- 18. 多次元配列を等価で比較する方法は?
- 19. z3pyデータ型/列挙型を文字列と比較する
- 20. =(等号)=を使った等価比較がJavaで正しく機能しないのはなぜですか?
- 21. 注文とコレクションの等価性を比較する
- 22. pthread_tとint入力の等価性を比較しますか?
- 23. shared_ptrオブジェクトの等価性を比較する
- 24. WPFコンボボックスのカスタム等価比較者
- 25. 入力イテレータの等価比較
- 26. 関数型の等価性を比較するにはどうすればよいですか?
- 27. Microsoft.TestApiオブジェクトの比較で列挙型の違いが認識されない
- 28. QTとDelphiの可能性の比較
- 29. arduinoで列挙型を比較するには?
- 30. Pythonで列挙型を比較するには?
「Enum」の標準インスタンスはすべて、「Eq」のインスタンスでもあると思います。なぜそうであってはならないのか、私は考えることができません。 – chi
私はあなたの質問をよく理解していません - それが役に立つと思われる例がほしいですか? – epsilonhalbe
私はかつてターミナルカラー用のデータ型を作成し、from/toEnum関数を使用してターミナルエスケープコードを作成しました。何らかの理由でプロダクションコードに平等が求められない場合は、テストコードに孤立したインスタンスを置くことができます。最も必要なのはEq – epsilonhalbe