私はまだHaskellに完全に精通しているわけではありませんが、自分でいくつかの演習を行っているときに、将来発生する可能性のある問題に遭遇しました。そうでない場合でも、将来的にこれを行う方法を知りたいと思います。
モジュールがあるとしましょう
module UserType where
data ThisModulesData = UserData String | ThisModulesInternal Int
moduleMethod :: (ThisModulesData -> Int) -> ThisModulesData -> Int
moduleMethod func dat = case dat of
UserData _ -> func dat
ThisModulesInternal i -> i
processList :: (ThisModulesData -> Int) -> [ThisModulesData] -> Int
processList func xs = sum $ map (moduleMethod func) xs
次に、このモジュールを使用したい場合は、次のようなものがあります
dataList :: [ThisModulesData]
dataList = [UserData "Type1", UserData "Type2", ThisModulesInternal 8]
processFunction :: ThisModulesData -> Int
processFunction (UserData command) = case command of
"Type1" -> 1
"Type2" -> 2
_ -> 0
processFunction _ = 0
result :: Int
result = processList processFunction dataList
私がやりたいのは、文字列をもっとhaskellのようなものに置き換えることです。そうすれば、タイプセーフであり、もしあればコンパイルエラーが発生する可能性があります。
dataList = [UserData "Wrong", UserData "ThisIsWrong", ThisModulesInternal 97]
ありがとう。StackOverflowの助けを借りて、Haskellを学ぶのはかなり楽しい時間でした。
編集:
明確にするために、モジュールファイルを静的なままにして、モジュールのユーザー実装で変更が必要なこと(たとえば、「type3」を追加する場合)が発生するようにします。