2012-04-07 5 views
1

これは、この質問への拡張のようなものです:それは結局のところどのモナドが必要ですか?

Dispatching to correct function with command line arguments in Haskell

だから、私は、他の機能にコマンドラインからの「コマンド」を派遣するためにはまだ良い解決策を持っていません。だから、私は上記の質問のアプローチを拡張したいと思います。テーブルに関数を手動で追加し、各関数に適切な変換関数を適用して、通常の引数の代わりに正しいサイズのリストを取る必要があるのは面倒です。代わりに、関数を追加し、コマンドラインから取り出す必要のある引数の数を「タグ付け」するテーブルを作成したいと思います。 「add」プロシージャは、正しい「takesXarguments」プロシージャを使用して作成し、テーブルに追加する必要があります。

テーブルに関数の「パッケージ」をインストールすることができます。これにより、パッケージのインストール時に変更されるため、テーブルの状態を把握できる必要があると思います。リーダーMonadまたはState Monadは私が探しているものですか?

答えて

1

モナドは必要ありません。あなたのタグ付けのアイデアは正しい方向にありますが、その情報はおそらくあなたとは異なる方法でエンコードされています。

私は、コマンドの定義から始めます:

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をとります。

これが役に立った。

  • この場合、それがあることが判明しますが、私はそれを推奨し、悪い習慣だと思っています。しかし、私は純粋主義者の何かです。より多くのダクトテープのハスケラーが私に同意しないかもしれない。
+0

私は純粋な母親であることを余儀なくされるハスケルスキルを持っていればいいと思う。あなたは、その機能がどのようにタグとして役立つかについて詳しく述べることができると思いますか?または、型がタグとして機能しますか?私はまだ混乱している。 btw、これは宿題に関するものではありません。それはちょうど私が学ぶのを手伝ってくれた小さなHaskellプロジェクトです。 –

関連する問題