我目前正在尝试20 Intermediate Haskell Exercises。我完成了前3个练习(但这是因为furry
== fmap
和Learn You a Haskell已经完成了这些练习。我目前仍然坚持说:
instance Fluffy (EitherLeft t) where
furry = error "todo"
我真的不知道该怎么做。在Learn You Haskell中,他们有一个名为newtype
的{{1}}变量,它接受一个元组。然后,他们可以进行模式匹配:
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"
。
我不一定想要答案。我只需要提示一下该做什么,因为我正在阅读,我可以解释一下,理解这些例子,但我不能真正理解我自己编写这些东西。
谢谢Dan,这就是我提出的解决方案:
t
答案 0 :(得分: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)
,并且需要进行模式匹配。