これはthis oneへのフォローアップの質問です。私はHaskellでどんなタイプのことを誤解していたと思うので、うまくいけば、質問のより良い形式ができあがります:パラメータの種類のちょうど2つのバリエーションを持つジェネリック関数を書く
ちょうど2つの引数で呼び出すことができる関数が必要です。これらの引数は、異なる型でなければなりません。たとえば、1つは文字列、もう1つは整数です。
は、このアプリケーション考えてみましょう:
combine "100" 500 -- results in 100500
combine 100 "500" -- results in 100500
combine 100 500 -- raises an exception
combine "100" "500" -- raises an exception
具体的な実装を書くための問題ではありません、それはこの機能に適切な署名を与えるために、私にとっては、しかし、問題となっています。
さらに一般的な解決策があるかどうかを知ることも興味があります(具体的な種類を指定する必要はなく、種類が異なるようにのみ指定します)。それは、引数を置換して固定することができれば、他の関数への入力を「修正」するために、この機能を使用
ありがとう
EDIT:。!下記
は私が期待していた何の不正確なコピーでありますそれはErlangでやるべきこと...まあ、それはかなり似ているはずなので、意味があると思います...
combine([String], Int)->
io:fwrite("~s~w~n", [[String], Int]);
combine(Int, [String])->
combine([String], Int).
それはタイプの問題ですので、あなたは「例外を発生させる」のは嫌だ、あなたはコンパイル時エラーをしたいと思います。違いはペタニックに聞こえるかもしれませんが、重要です。 Haskellでは、可能であればコンパイル時エラーが常に必要です。また、ハスケルの代わりにPythonで考えているように思えます:P –
これを行う正しい方法は 'combine :: Integer - > String - > String'です。これは、各タイプの引数を1つだけ取ることを保証します。それは簡単です、それは明らかです。高度な機能は含まれていません。何を求めることができますか? – Carl
私は個人的には、単にcombineStrInt :: String-> Int-> Int'と 'combineIntStr :: Int-> String-> Int'という2つの関数を作ることをお勧めします。私は*ただ一つの関数を推奨し、必要に応じて引数の順序を逆にするために 'flip'を使いますが、あなたの例ではパラメータを反転するだけで正しい結果が得られません。実際には、おそらく 'flip'が役に立つでしょう。 –