Я пытаюсь реализовать в Haskell функцию типа Maybe [[Maybe a]] -> [[a]]. Я пробовал несколько методов, но самый близкий из них:

ex :: Maybe [[Maybe a]] -> [[a]]
ex list = let l=list!!0 
          in []++(sequence l)

Это дает мне следующую ошибку:

Couldn't match expected type `[a0]'
                with actual type `Maybe [[Maybe a]]'
    In the first argument of `(!!)', namely `list'
    In the expression: list !! 0
    In an equation for `l': l = list !! 0

Я знаю, что ошибка связана с тем, что первый аргумент аргумента !! не является обычным списком, но я не могу понять это.

2
Nick 27 Ноя 2016 в 17:07

2 ответа

В jpath сказано, что вы можете искать функцию catMaybes, но ее лучше реализовать самостоятельно, чтобы научиться. Но если кто-то пошел сюда не учиться, а просто получить полное решение, то вот оно:

import Data.Maybe (catMaybes)

ex :: [[Maybe a]] -> [[a]]
ex = map catMaybes
0
Community 23 Май 2017 в 10:29

Смотрим на подпись ex :: Maybe [[Maybe a]] -> [[a]]. Первое, что вам нужно сделать, это сопоставление с образцом в различных конструкторах вашего аргумента:

ex :: Maybe [[Maybe a]] -> [[a]]
ex (Just list) = undefined
ex Nothing = undefined

Итак, мы должны рассмотреть два случая. Для Nothing вы, скорее всего, просто вернете []. В случае Just вы, вероятно, захотите удалить все элементы Just во внутреннем списке:

ex :: Maybe [[Maybe a]] -> [[a]]
ex (Just list) = catInnerMaybes list
ex Nothing = []

catInnerMaybes :: [[Maybe a]] -> [[a]]
catInnerMaybes (xs:xss) = undefined
catInnerMaybes [] = undefined

Снова для catInnerMaybes мы хотим сопоставить наш аргумент с образцом вместо использования таких методов, как (!!). Остальное я пока оставлю вам, но вот еще несколько советов:

  • Попробуйте использовать : вместо ++, так как это более естественный и идиоматический способ работы со списками, и потому что ++ быстро замедляется.
  • Не думаю, что вы хотите sequence. Вы можете зависеть от того, что именно вы пытаетесь сделать, но я думаю, что вы, скорее всего, будете искать catMaybes в Data.Maybe. Однако я бы порекомендовал вам не использовать и это, а реализовать самостоятельно для эффекта обучения.
1
jpath 27 Ноя 2016 в 14:37