3

次のようなコードのスニペットがあります。

data SomeData = A | B | C | D | E deriving (Show, Enum)

そして、特定の値をこれらのタイプに簡単にマップできるようにしたいと思います。charを型にマップしたいとします。次のSomeDataようにします。

mappings = zip "abcde" [A, B, C, D, E]

これにより、などが生成[('a',A),('b',B)...]されます。型クラスを使用すると、便利な関数を使用Enumしてデータ型を上記のリスト()に変換することで、これを簡単に実行できるようになることを期待していました。[A, B, C, D, E]

標準ライブラリにそのような関数はありますか?または、このようなものを使用したい場合は、自分で定義する必要がありますか?

4

7 に答える 7

7

さらに一般的にすることができます:

-- added deriving Bounded
data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)

fullRange :: (Bounded a, Enum a) => [a]
fullRange = enumFromTo minBound maxBound

次に、呼び出すだけfullRangeです(必要に応じて明示的な型アノテーションを使用して:) fullRange :: [SomeData]

于 2012-10-22T20:53:09.263 に答える
5

さらに派生する場合はBounded、「最小の」コンストラクター名が何であるかを明示的に知らなくても、これを行うことができます。

Prelude> data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)
Prelude> [minBound :: SomeData ..]
[A,B,C,D,E]
于 2012-10-22T20:51:53.733 に答える
3

一般的に、私はします

mappings = zip "abcde" [A..]

でも私は一緒に行きたくなります

mappings = zip ['a' ..] [A ..]

後で他の文字を追加すると、コードが更新されるようにします。

私が定義する最大限の将来性のある作業を行う

import Data.Char

data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)

allData :: SomeData
allData = enumFrom minBound

mapppings = zip (map (toLower.head.show) allData) allData

私が未来についてしている唯一の仮定は、それが一文字で構成されているということです。

ただし、これは機能しており、実際にはそれほど明確ではありません。

于 2012-10-22T20:53:59.613 に答える
2

http://hackage.haskell.org/packages/archive/base/3.0.3.2/doc/html/GHC-Enum.htmlを見ると、必要な関数が型クラスの一部であることがEnumわかります。私があなたの質問を正しく理解していれば。

>enumFrom A
[A, B, C, D, E]
it :: [SomeData]
于 2012-10-22T20:36:41.700 に答える
2

実際には、範囲を使用することもできます。

[A .. E]

貴重なLearnYouAHaskellで説明されているように。

于 2012-10-22T20:40:24.010 に答える
2

Bounded派生物に追加すると[minBound ..]、完全なリストを取得するために行うことができます。

于 2012-10-22T20:52:19.323 に答える
1

ghciでこれを試してください

> [A ..]
[A,B,C,D,E]
于 2012-10-22T20:41:02.007 に答える