Вы также можете использовать следующий шаблон для различных арностей для bar
:
Arity 2
-- bar :: [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs
Arity 3
-- bar :: [MType] -> [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs <*> xs
и т. Д.
Мне нравится это, так как его проще расширить, чем жестко закодированный liftA2
.