2015-12-08 5 views
7

演技:ハスケル - さまざまなタイプを受け入れ、私は以下の非常に基本的な例だと言うましょ応じ

f :: Either Int String -> IO() 

だけでなく、機能g :: Int -> IO()と機能g' :: String -> IO()を、私は基本的に、「セレクタ」としてfを実装したいですその入力に応じてgまたはg'を呼び出すので、将来私はfで作業する必要があります。なぜなら、私のプログラムはIntまたはStringにしか遭遇しないことがわかっているからです。

Eitherを使用するこの方法は意味がありますか?このコンベンションは、主にエラーと例外の処理に使用されているようです。

このような例を実装するには、適切な方法やベストプラクティスは何でしょうか。私は聞いたことがある/ caseとbifunctorsについて読む。

異なる入力タイプの可能性を処理する方法は何ですか?それとも初めから避けなければならないものですか?

+2

「g」と「g」は何をするのですか?あなたが達成しようとしていることに応じて、これは賢明なアイデアかもしれません。 – MathematicalOrchid

+6

はい、この機能はすでに「どちらか」として存在します。 – Lee

+1

sum型( 'Either')の値を取り除く方法を知りました。ニース!これは関数型プログラミングの基本的な操作です。あなたが見てきたように、実際には2つの関数が必要です。それぞれの可能なコンストラクタ( 'Left/Right')に対して1つです。 – chi

答えて

8

だからそれは間違いなく意味をなすことができ、それを実装する1つの方法は次のとおりです。

f :: Either Int String -> IO() 
f e = 
    case e of 
     Left l -> g l 
     Right r -> g' r 

またはeitherを使用して:第二版では、私は、変数名を割り当てないことを

import Data.Either (either) 
f :: Either Int String -> IO() 
f = either g g' 

注意Either Int String引数に指定します。それはeta conversion/eta reductionと呼ばれます。しかし明らかにあなたはf e = either g g' eと書くこともできます。

5

アームチェアのハスケルプログラマとして、それは私にとってはうまくいくようです。

f :: Either Int String -> IO() 
f (Left n) = g n 
f (Right s) = g' s 
関連する問題