Reputation: 366
i'm a newbie with functional programming and CLEAN. I have a few functions and i get error in one, and i cannot figured out why. (I tagged that with Haskell because it's very similar to CLEAN.)
My module:
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]
It fails at the sequence definition:
Type error [Prac.icl,32,sequence]: near combine : cannot unify types:
[v8] -> Maybe [v4]
Maybe [v5]
Many Thanks!!
Upvotes: 0
Views: 162
Reputation: 52270
This will work in 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)
but I'm not sure if it does what you want:
λ> sequence [Just 1, Just 3, Just 4]
Just [1,3,4]
λ> sequence [Just 1, Nothing, Just 4]
Nothing
λ> sequence []
Just []
ok, I have found a translation scheme - but no gurantee as I don't have a way to test it rigth now
sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence [x:xs] = combine x (sequence xs)
not sure about the empty list and the signature though - sorry
Anyway if you can reuse the idea that you just combine the head of the given list with the recursive computated sequence of the tail you should be fine
So I just downloaded the IDE, made a project, added one module:
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)
compiled this, updated the project and did run it - and here this works
Upvotes: 5