Это взято из упражнения в книге Haskell from First Principles. Упражнение состоит в том, чтобы реализовать Applicative
для ZipList'
, что аналогично ZipList
в Prelude. В книге есть такая подсказка
Проверьте Prelude на наличие функций, которые могут дать вам то, что вам нужно. Один начинается с буквы
z
, другой с буквыr
. Вы ищете вдохновение в этих функциях, чтобы не иметь возможности повторно использовать их напрямую, поскольку вы используете пользовательский типList
, а не предоставленный тип спискаPrelude
.
Я предположил, что функция, которая начинается с z
, это zipWith
, но я не знаю о функции, которая начинается с r
.
data List a =
Nil
| Cons a (List a)
deriving (Eq, Show)
zipWith' :: (a -> b -> c) -> List a -> List b -> List c
zipWith' _ Nil _ = Nil
zipWith' _ _ Nil = Nil
zipWith' f (Cons x xs) (Cons y ys) = Cons (f x y) (zipWith' f xs ys)
newtype ZipList' a = ZipList' (List a)
deriving (Eq, Show)
instance Functor ZipList' where
fmap f (ZipList' xs) = ZipList' $ fmap f xs
instance Applicative ZipList' where
pure x = ZipList' $ Cons x Nil
(ZipList' fs) <*> (ZipList' xs) = ZipList' $ zipWith' ($) fs xs
Это проходит тестовый пример в книге, но мне интересно, есть ли лучший способ реализовать это, поскольку я не использовал функцию, начинающуюся с r
. У меня есть ощущение, что это должно было быть repeat
, потому что оно также должно работать с бесконечными списками.
instance Applicative
работает над типомZipList'
, который вы здесь не определили? - person Willem Van Onsem   schedule 28.10.2019pure
неверен, и как только вы разберетесь с правильной реализацией, вы увидите, о какой функции, начинающейся сr
, идет речь. Ключ должен думать о требовании законногоApplicative
экземпляра, которыйfmap f x == (pure f) <*> x
, и признать, что не существует верхнего предела длины спискаx
. Этого должно быть достаточно для того, чтобы вы поняли это. - person Robin Zigmond   schedule 28.10.2019pure 1 :: ZipList Int
создает бесконечный список, так что это, кажется, моя проблема, я сейчас пытаюсь понять, как это удовлетворяет закону. - person Brady Dean   schedule 28.10.2019