8

我目前正在尝试做20 个中级 Haskell 练习。我能够完成第 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

所以一个值可以有 type Either a b,但没​​有类似Either "one" 1或类似的值,而是Left "one", or Right 1

因此,在 的情况下EitherLeft,类似地,它的值看起来像EitherLeft (Left a)or EitherLeft (Right b),并且需要像这样进行模式匹配。

于 2012-08-21T02:31:31.377 回答