モナドは必要ありません。あなたのタグ付けのアイデアは正しい方向にありますが、その情報はおそらくあなたとは異なる方法でエンコードされています。
私は、コマンドの定義から始めます:
type Command = [String] -> IO()
その後、あなたは「コマンドメーカー」機能を行うことができます。
mkCommand1 :: (String -> IO()) -> Command
mkCommand2 :: (String -> String -> IO()) -> Command
...
タグとして機能します。もちろんmkCommand1
等
printHelloName :: Command
printHelloName = arg $ \first -> arg $ \last -> do
putStrLn $ "Hello, Mr(s). " ++ last
putStrLn $ "May I call you " ++ first ++ "?"
ができ:だからあなたのようなコマンドを書くことができることを
arg :: (String -> Command) -> Command
arg f (x:xs) = f x xs
arg f [] = fail "Wrong number of arguments"
:あなたは機能の増殖が気に入らない場合は、「コマンドラムダ」を作ることができます両方の世界の最高のために簡単にarg
という言葉で書かれています。
パッケージの場合、Command
は、複数のサブコマンドの間で選択肢を十分にカプセル化しますが、作成しません。あなたがNothing
を返さない最初のアクションを取ることによって、単一の一つに、複数のCommand
Sを構成することができます
type Command = [String] -> Maybe (IO())
:1つのオプションは、ここにCommand
を変更することです。今度はあなたのパッケージはちょうどタイプCommand
の値です。 (一般的にハスケルでは、パッケージやリストではなく、これらのコンポジションに非常に興味があります。複合オブジェクトを作るためにオブジェクトの2つをどのように取るかについて考えてみてください)
欲望からあなたを救うには、 (1)関数が取る引数の数を検出するための合理的な方法はありません。(2)型を数値に依存させる方法がないので、mkCommand
を作成することはできません。最初の引数として引数の数としてInt
をとります。
これが役に立った。
- この場合、それがあることが判明しますが、私はそれを推奨し、悪い習慣だと思っています。しかし、私は純粋主義者の何かです。より多くのダクトテープのハスケラーが私に同意しないかもしれない。
私は純粋な母親であることを余儀なくされるハスケルスキルを持っていればいいと思う。あなたは、その機能がどのようにタグとして役立つかについて詳しく述べることができると思いますか?または、型がタグとして機能しますか?私はまだ混乱している。 btw、これは宿題に関するものではありません。それはちょうど私が学ぶのを手伝ってくれた小さなHaskellプロジェクトです。 –