Сейчас я пытаюсь выполнить 20 промежуточных упражнений на Haskell. Мне удалось выполнить первые три упражнения (но это потому, что furry
== fmap
и Learn 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
data Foo = Foo
имя с заглавной буквы должно стоять слева от=
только когда-либо появляется в сигнатурах типов и объявлениях экземпляров классов. Имя, написанное с заглавной буквы справа от=
, появляется только в коде. - person jberryman   schedule 21.08.2012