5

次のような Haskell 型を定義しました。

data TypeData = TypeA Int | TypeB String | TypeC Char deriving (Eq, Show)

ある時点で、[TypeData]すべての非 TypeC インスタンスをフィルタリングする方法が必要です。私が書こうとしている関数の署名は次のとおりです。

-- Returns a tuple containing (TypeC elements, non-TypeC elements)
partitionTypeCs :: [TypeData] -> ([TypeData],[TypeData])

関数はこれpartitionに適しているようでした:

-- Attempt:
partitionTypeCs data = partition (TypeData -> Bool) data

ただし、どの関数が型 signature に一致するかわかりませんTypeData -> Bool。型インスタンスが特定のインスタンスのものかどうかを判断できる関数が必要なようです。別の関数 ( ) を記述することでパターン マッチングを使用できることはわかっていますisTypeC (TypeC _) = Trueが、型インスタンスを一致させるより一般的な方法またはラインラインの方法はありますか?

4

2 に答える 2

5

私は次のようにします:

partitionTypeCs = partition f where
  f (TypeC _) = False
  f _ = True

なぜあなたがこれを気に入らないのか理解できないことを認めなければなりません。不明なパラメーターが含まれているため、等式を使用してコンストラクターと比較することはできません。パターン マッチングは、ここで行う必要があることを正確に行います。

于 2013-09-09T21:25:06.557 に答える
3

ここでの答えはパターン マッチングです。追加で 3 行 (型シグネチャを含む) かかるため、長いソリューションではありません。おそらく、一般的にそれを実行できるテンプレート haskell を作成することもできますが、それは非常に単純なものに対して複雑すぎるソリューションのように思えます。

isTypeC :: TypeData -> Bool
isTypeC (TypeC _) = True
isTypeC _ = False
于 2013-09-09T21:27:01.070 に答える