Ошибка при использовании типов 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)
скомпилировал это, обновил проект и запустил его - и вот это работает