Ошибки скорее синтаксические, чем семантические.В вашем определении:
Twice <b>f</b> <b>f</b> <*> Twice <b>x</b> <b>x</b> = Twice ((f x) (f x))
то же самое в определении Functor
:
fmap f (Twice <b>a</b> <b>a</b>) = Twice (f a) (f a)
Вы пишете два f
и два x
в голове.Haskell не позволяет этого (Пролог делает, но даже тогда, вероятно, это не то, что вы имеете в виду).
Кроме того, в теле вы пишете:
((f x) (f x))
Это означает, что вы бы сделаливызов функции с f x
функцией и f x
аргументом, что опять же, вероятно, не то, что вы хотели.
Мы можем исправить это синтаксически следующим образом:
instance Functor Twice where
fmap f (Twice a <b>b</b>) = Twice (f a) (f <b>b</b>)
instance Applicative Twice where
pure x = Twice x x
Twice <b>f</b> <b>g</b> <*> Twice <b>x</b> <b>y</b> = Twice <b>(f x) (g y)</b>
Обратите внимание, что вывсе еще необходимо доказать, что это действительный экземпляр Functor
и Applicative
, принимая во внимание ограничения, задокументированные для этих классов типов.