8

私は現在、20 の Intermediate Haskell Exercisesを実行しようとしています。最初の 3 つの演習を完了することができました (ただし、これはfurry==fmapLearn You a Haskellに既にそれらの実装があるためです)。私は現在、次のようなインスタンスで立ち往生しています:

instance Fluffy (EitherLeft t) where                                        
  furry = error "todo"

私は何をすべきか本当に理解していません。Learn You Haskell には、タプルを受け取るというnewtype変数があります。Pairその後、次のようにパターン マッチングを実行できます。

  fmap f (Pair (x,y)) = Pair (f x, y)

私はあなたが私の状況で似たようなことをすることができるかもしれないと考えていました:

  furry f (EitherLeft (Either a b)) = EitherLeft (Either (f a) b)

しかし、それはうまくいきません:

Not in scope: data constructor `Either'

import Data.Either彼が持っていて私が持っていない重要なものがあるかもしれないので、私はそうするかもしれないと思っていました。しかし、それは問題ではありませんでした。

私もこれを機能させようとしました:

  furry f (EitherLeft a b) = error "todo"

しかし、それもうまくいきません:

Constructor `EitherLeft' should have 1 argument, but has been given 2

私もこれを機能させることができませんでした:

  furry f (Right x) = (Right f x)
  furry f (Left x) = Left x

エラーが発生しました:

Couldn't match expected type `EitherLeft t a'
            with actual type `Either t0 t1'

私は得ることができただけです:

  furry f (EitherLeft t) = error "todo"

仕事に。しかし、私は何をすべきかわかりませんt

必ずしも答えが欲しいわけではありません。私は何をすべきかについてのヒントが必要です。私は読んでいて、例をある程度理解することができますが、自分でこのようなものを正しくコーディングすることに頭を悩ませることはできません。

ダンに感謝します。これが私の解決策として思いついたものです。

instance Fluffy (EitherLeft t) where                     
  furry f (EitherLeft (Left x)) = EitherLeft $ Left  (f x)                   
  furry f (EitherLeft (Right x)) = EitherLeft $ Right x
4

1 に答える 1

13

あなたが抱えている問題は、Eitherデータ型にEitherと呼ばれるデータコンストラクターがないことです。基本的に、Either型は次のようになります

data Either a b = Left a
                | Right b

したがって、値はタイプを持つことができますが、またはそのようなEither a b値はありませんEither "one" 1が、代わりにLeft "one"、またはRight 1.

したがって、 の場合EitherLeft、同様にその値はEitherLeft (Left a)またはEitherLeft (Right b)のようになり、そのようなものに対してパターン マッチングする必要があります。

于 2012-08-21T02:31:31.377 に答える