(,) <$> xs (show <$> cs)
анализируется как
(,) <$> (xs (show <$> cs))
Обратите внимание, что здесь вы вызываете xs
как функцию, с show <$> cs
в качестве аргумента.Это не может быть правдой: xs
- это строка!
Поскольку вы, похоже, пытаетесь программировать в аппликативном стиле, вы, вероятно, хотели написать что-то в форме
f <$> a <*> b
В вашем случае,
f = (,)
a = xs
b = show <$> cs
Итак, вы хотели написать:
(,) <$> xs <*> (show <$> cs)
Это как бы близко к тому, что вы хотели, но есть несколько проблем.Во-первых, это тип [(Char, String)]
, где вы хотите, чтобы они были объединены в строки.Это можно исправить, используя (:)
вместо (,)
.
Во-вторых, поскольку один список бесконечен, вам нужно обработать его как «самый внешний цикл» - если это внутренний цикл, то факт, чтоэто никогда не кончится, будет означать, что ваши другие петли никогда не прогрессируют.При использовании []
в качестве Аппликатива, «внешняя петля» - это первое, что вы отображаете.
Итак, мы можем попробовать:
(,) <$> (show <$> cs) <*> xs
Примечание. Я вернулся к(,)
на мгновение, чтобы выделить что-то:
Prelude> take 5 $ (,) <$> (show <$> cs) <*> xs
[("1",'A'),("1",'B'),("1",'C'),("2",'A'),("2",'B')]
Теперь мы получаем пары, которые вы хотите, но (:)
больше не будет работать с ними, потому что они в неправильном порядке.Итак, вам нужно использовать другую функцию, такую как (:)
, но которая принимает свои аргументы в другом порядке.К счастью, такую функцию легко создать: просто flip (:)
:
Prelude> take 5 $ (flip (:)) <$> (show <$> cs) <*> xs
["A1","B1","C1","A2","B2"]