2016-04-04 7 views
0

ハスケルIは、以下の構造を有する新しい演算子を作成し、制御誤差

テラ[[ '0'、 '1'、 '0'、 '1']、[ '0'、 '1'、 '0'、 '1']、[ '1'、 '0'、 'G'、 '1']

およびDE機能:

esTerra:: Taulell -> (Int,Int) -> Bool 
esTerra t (u,d) = 
    case t!!!u!!!d of 
     Left e -> False 
     Right p -> True 


(!!!) :: [a] -> Int -> Either Bool a 
xs !!! n | n < 0 = Left False -- error Exception: Prelude.!!:... 
[] !!! _ = Left False   -- error Exception: Prelude.!!:... 
(x:_) !!! 0 = Right x 
(_:xs) !!! n = xs!!!(n-1) 

機能!操作と同じです!あなたがエラーメッセージを返すために持っているときが、偽

が、リターンエラーを返します。

Couldn't match expected type ‘[a0]’ 
      with actual type ‘Either Bool [Char]’ 
In the first argument of ‘(!!!)’, namely ‘t !!! u’ 
In the expression: t !!! u !!! d 
In the expression: 
    case t !!! u !!! d of { 
    Left e -> False 
    Right p -> True } 

から?

感謝の

+3

あなたの 'Either Bool a'は決して' Left True'を使うことはないので、 'Maybe a'を使うのと同じです。もしあなたの選択が' Either'ならば 'Either String'を使うことをお勧めします。 'Left'を使い、' Left 'という説明的なエラーメッセージ " – epsilonhalbe

答えて

2

私はTaulellがあるかわからない、のは、いくつかのaためTaulell = [[a]]を推測してみましょう。私たちは、それゆえ

t :: [[a]] -- Taulell 
u :: Int 
d :: Int 

t !!! u :: Either Bool [a] 

持っ

はその後、我々は

(t !!! u) !!! d 

を書きますが、ここで一番左の引数がリストではありません、それはEither Bool [a]です。したがって、タイプエラーが発生する。

代わりに、

case t !!! u of 
    Left b -> ... 
    Right l -> case l !!! d of 
       Left c -> ... 
       Rigth w -> ... 
+0

"を使用しています。それは段階的に行うことです。ありがとうございました – Merche

+2

@MercedesCabreraTorres:それはどのように段階的に完了したのかを理解するべきですが、それは大規模なプロジェクトではどうやってやるのでしょうか。 2つではなく、おそらく失敗する可能性のある計算を入れ子にすると、それぞれに独自の「ケース」を与えることは、実際には非常に扱いにくいことになります。幸いにも、モナドのインスタンスは、この負担を私たちから受け取ります! – leftaroundabout

1

!!!その左側の引数としてリストが必要ですが、ネストされたリストについては、それが結果として、単純なリストを与えるものではありません。その結果、Either Bool [a]となります。

あなたが !!!への引数としてそれを再度使用することはできませんが、あなたは簡単に十分な Either -containedリストに !!!を適用することができます

ここ
esTerra:: Taulell -> (Int,Int) -> Bool 
esTerra t (u,d) = 
    case t!!!u >>= (!!!d) of 
     Left e -> False 
     Right p -> True 

、私は単項バインド演算子を使用しました>>= 2つの可能性のある失敗するルックアップを1つに結合すると、の両方がルックアップの場合にのみ成功します。これは、caseの構造体as shown by chiを使用しての2回の構造を明示的にアンラップすることに相当します。

+0

>>> = と等価です。左b - > ... 右l - >ケースl !!!d ....の?感謝の – Merche

+0

はい、この場合は同等です。しかし、モナドの束縛ははるかに一般的です。 – leftaroundabout

関連する問題