Я пытался определить эту функцию, чтобы перегруппировать три списка пар:RankNTypes: применить ту же функцию для пар различных типов
{-# LANGUAGE RankNTypes #-}
mapAndZip3 :: (forall x. x -> f x) -> [a] -> [b] -> [c]
-> [(f a, f b, f c)]
mapAndZip3 f la lb lc = zipWith3 (\a b c -> (f a, f b, f c)) la lb lc
main = do
let x = mapAndZip3 (fst) [(1,"fruit"), (2,"martini")]
[("chips","fish"),("rice","steak")]
[(5,"cake"),(4,"pudding")]
print x -- was expecting [(1,"chips",5), (2,"rice",4)]
Сначала я не включил RankNTypes
или в forall
, но потом после определения this, а именно определения liftTup
, я думал, что этого должно быть достаточно.
Но ясно, что это не было, так как я все еще получаю ошибку:
mapAndZip3.hs:8:25:
Couldn't match type `x' with `(f0 x, b0)'
`x' is a rigid type variable bound by
a type expected by the context: x -> f0 x at mapAndZip3.hs:8:13
Expected type: x -> f0 x
Actual type: (f0 x, b0) -> f0 x
In the first argument of `mapAndZip3', namely `(fst)'
Я четко иметь ограниченное понимание forall
ключевого слова, но от того, что я понял, что должен в этом случае позволяют для f
принять любой тип. Я не понимаю: один раз в данном контексте и используется один раз, определяет ли определение «фиксированный» для оставшегося контекста?
Это не похоже, потому что, если я заменю «чипы» и «рис» на Интс, компилятор все еще жалуется, поэтому я предполагаю, что я принимаю что-то неправильно (конечно, если я удалю аннотацию типа mapAndZip3
в этом последнем случае все работает, потому что подпись упрощается до mapAndZip3 :: (a -> t) -> [a] -> [a] -> [a] -> [(t, t, t)]
, но это не то, что я хочу).
Я также нашел эту question, но не могу сделать, если это та же проблема или нет, так как функция Я пытаюсь применить не id
, но fst
или snd
, функции, которые на самом деле возвращают различные типы (a -> b)
.
Спасибо! Мне было очень трудно выбрать «один» правильный ответ, так как оба объясняют, что это невозможно. И, в общем, мне очень нравится, как Даниэль Фишер отвечает за то, что он был самым легким для понимания вначале, оставленный ответ дал мне дополнительный контекст. Приветствия обоим! – jcristovao