Поясните пару моментов, которые хоть и решил, но все равно остались не понятны
Была ошибка, связанная с тем что обработчик 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