Как преобразовать тип данных списка 'Real World Haskell' в использование Maybe?

Я изучал "Real World Haskell", и я застрял в разработке как использовать Maybe. Я написал этот тип данных и соответствующую функцию из Главы 3. В книге предлагается попытаться преобразовать его в тип Maybe и избавиться от типа Nil. Я играл с этим, но я не могу понять, как это сделать. Я пытался добавить, может быть, в разных местах, но я просто догадываюсь, а не знаю, как это сделать.

data List a = List a (List a)
            | Nil
            deriving (Show)

toList :: List a -> [a]
toList (List a Nil) = a:[]
toList (List a as)  = a:(toList as)

2 ответа

Решение

Посмотри на это:

data List a              data Maybe a
    = List a (List a)        = Just a
    | Nil                    | Nothing

Когда вы пишете это так, параллель выглядит довольно ясно - нам просто нужно поместить некоторые дополнительные данные в Just боковая сторона! Чтобы поместить "лишние" данные, мы можем использовать кортеж. Единственный другой недостаток в том, что мы должны назвать конструктор.

data List' a = List' (Maybe (a, List' a {- here's the extra bit -}))
data List a = List a (Maybe (List a))

сделал бы это. Вы бы имели List 1 (Just (List 2 Nothing)) представлять [1, 2], Я не знаю, является ли он самым элегантным или самым простым в использовании.

Другие вопросы по тегам