Krzysztof Kościuszkiewicz wrote:
Fellow Haskellers,
I wanted to experiment a bit with lists and sequences (as in Data.List and
Data.Sequence), and I got stuck. I wanted to dynamically select processing
function depending on cmdline argument:
main = do
args <- getArgs
let reversor = case args of
["sequence"] -> reverseList
["list"] -> reverseSeq
_ -> error "bad args"
input <- getContents
let output = reversor $ lines $ input
mapM_ putStrLn output
In my oppinion reversor would have type
reversor :: (Foldable f) => [a] -> f b
No, this is the wrong type. To find the correct type, if you look at the
type of the input argument in your code it will be the result of
(lines), so from ghci:
Prelude> :t lines
lines :: String -> [String]
Prelude>
Therefore (reverseor) has type [String] -> ???
Now for the output type, you are using (output) as an input to (mapM_
putStrLn). (mapM_) takes a list and uses its argument to do something to
each element of the list. So, since the input to (putStrLn) is (String),
the input to (mapM_ putStrLn) is ([String]).
Therefore
reversor :: [String] -> [String]
So reverseList is just Data.List.reverse as you've got it (though
presumably you meant to write ["list"] -> reverseList and not reverseSeq).
For using Data.Sequence to implement reversor, all you need to do is
first convert [String] to Seq String, reverse the sequence, then convert
back from Seq String to [String].
Hope this helps,
Brian.
but I couldn't get this to work. I've tried typeclass approach:
class (Foldable f) => Reversor f where
reverse' :: [a] -> f a
instance Reversor ([]) where
reverse' = Data.List.reverse
instance Reversor ViewR where
reverse' = viewr . foldr (<|) empty
reverseList = reverse' :: (???)
reverseSeq = reverse' :: (???)
but now in order to differentiate between "reverse'" functions I'd
have to provide different type annotations, and then "reversor" won't
typecheck...
Similar problem surfaced with this try:
data Proc = SP | LP
reverseList = reverse' LP
reverseSeq = reverse' SP
reverse' :: (Foldable f) => Proc -> [a] -> f a
reverse' LP = Data.List.reverse
reverse' SP = viewr . foldr (<|) empty
So now I'm looking for some suggestions how should I approach the
problem...
Regards,
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe