Ошибка при использовании типов Maybe в CLEAN

Я новичок с функциональным программированием и CLEAN. У меня есть несколько функций, и я получаю ошибку в одной, и я не могу понять, почему. (Я пометил это с помощью Haskell, потому что это очень похоже на CLEAN.)

Мой модуль:

module Prac

combine :: (Maybe a) (Maybe [a]) -> Maybe [a]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just [x:xs]) = Just [d, x:xs]

sequence :: [Maybe a] -> Maybe [a]
sequence [Just x:xs] =  combine  (Just x)  Just[xs]

Сбой при определении последовательности:

 Type error [Prac.icl,32,sequence]: near combine : cannot unify types:
 [v8] -> Maybe [v4]
 Maybe [v5]

Большое спасибо!!

1 ответ

Решение

Это будет работать в Haskell:

combine :: Maybe a -> Maybe [a] -> Maybe [a]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just (d:xs)

sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence (a:xs) =  combine  a (sequence xs)

но я не уверен, что он делает то, что вы хотите:

λ> sequence [Just 1, Just 3, Just 4]
Just [1,3,4]

λ> sequence [Just 1, Nothing, Just 4]
Nothing

λ> sequence []
Just []

хорошо, я нашел схему перевода - но нет гарантии, так как у меня нет способа проверить это прямо сейчас

sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence [x:xs] =  combine x (sequence xs)

не уверен насчет пустого списка и подписи - извините

В любом случае, если вы можете повторно использовать идею о том, что вы просто комбинируете заголовок заданного списка с рекурсивной вычисляемой последовательностью хвоста, у вас все будет хорошо.

это работает для меня, используя чистый

Поэтому я просто скачал IDE, сделал проект, добавил один модуль:

module seq

:: MayBe a = Just a | Nothing

Start = sequence [Just 3, Just 4, Just 5]

combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just [d:xs]

sequence [] = Just []
sequence [x:xs] =  combine x (sequence xs)

скомпилировал это, обновил проект и запустил его - и вот это работает

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