[Haskell] поясните пример
От: Аноним  
Дата: 05.11.09 09:49
Оценка:
Поясните пару моментов, которые хоть и решил, но все равно остались не понятны
Была ошибка, связанная с тем что обработчик Nothing и Just v должны возвращать один тип:
из — за этого пришлось писать дополнительную функцию update, т.к. H.update возвращает IO Bool,
как можно короче написать этот код? И автоматически следует следующий вопрос, если обработчики case возвращают значения, то
как их можно получить? Правильно ли написал функцию fill? происходит ее замыкание (вроде правильно сказал)?
И у меня не получилось записать putStr $ show $ H.toList m , как можно это дело записать в одну строчку?
И интересует как этот код можно улучшить и в чем оверхед

import System.IO
import qualified Data.HashTable as H

fillMark :: H.HashTable String [String] -> [String] -> IO ()
fillMark m (f1:f2) = fill f1 f2
         where fill :: String -> [String] -> IO ()
               fill _    []       = return ()
               fill pref (suf:zs) = 
                    do find <- H.lookup m pref
                       case find of
                            Nothing -> H.insert m pref [suf]
                            Just v  -> update pref (v ++ [suf])
                                              where update :: String -> [String] -> IO ()
                                                    update key val = do H.update m key val   
                                                                        return ()
                       fill suf zs
                                                                            
main :: IO ()
main = do
       s <- readFile "c:\\test.hs"
       m <- H.new (==) H.hashString
       fillMark m (words s)   
       l <- H.toList m 
       putStr $ show l
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.