同じサイズ、同じ内容、同じチェックサムなど、さまざまな「理由」で同じファイルをグループ化する小さな「hello world」タイプのプログラムを作成しています。
したがって、次のような関数を書きたいと思うようになりました (DuplicateReason は、2 つのファイルが同一である理由を示す代数型です)。
getDuplicatesByMethods :: (Eq a) => [((FilePath -> a), DuplicateReason)] -> IO [DuplicateGroup]
各タプルのどこで、最初の関数は、ファイルのパスによってバイト文字列 (コンテンツを含む)、またはチェックサムを含む Word32、サイズを含む Int などの (Eq a) 値を返す関数です。
明らかに、Haskell はこれらの関数が異なる型であることを好まないので、どうにかしてそれらを集める必要があります。
次のようなタイプを作成する唯一の方法
data GroupableValue = GroupString String | GroupInt Int | GroupWord32 Word32
そして、生活を楽にするために、型クラスを次のようにします
class GroupableValueClass a where
toGroupableValue :: a -> GroupableValue
fromGroupableValue :: GroupableValue -> a
取得する各値のインスタンスを実装します。
質問: 私はそれを正しく行っていますか? (そうでない場合) このタスクを解決する簡単な方法はありますか?
アップデート:
これは、私が望むものを説明する必要がある完全な最小限のコードです(簡素化され、IOなどはありません):
data DuplicateGroup = DuplicateGroup
-- method for "same size" -- returns size
m1 :: String -> Int
m1 content = 10
-- method for "same content" -- returns content
m2 :: String -> String
m2 content = "sample content"
groupByMethods :: (Eq a) => [(String -> a)] -> [DuplicateGroup]
groupByMethods predicates = undefined
main :: IO ()
main = do
let groups = (groupByMethods [m1, m2])
return ()