LINUX.ORG.RU

История изменений

Исправление qnikst, (текущая версия) :

main = getargs >>= \(x:_) -> putstrln =<< fmap (case x of "-d" -> go true ; "-e" -> go false ; _ -> error "usage foobar") getcontents
        
go tp d = unlines $ map (unwords . map (fromjust . (`m.lookup` m)) . words) t
  where (m,h,t) | tp =
          let (_,l,m) = foldl' (\(i,l,m) v -> case m.lookup v m of nothing -> (i+1,v:l, m.insert v (show i) m) ; _ -> (i,l,m)) (0,[],m.empty) (words d)
          in (m,l,lines d)                                                              
                | otherwise = (\(a,b) -> (a,[],b)) $ ((m.fromlist . (zip [show x | x <- [0..]]) . words . head) &&& tail)  (lines d)

6 строк :) нормально, с учетом разделения чистых и не-чистых вычислений.

Впрочем, логично, что скриптового языка меньше, но термин «многословый» минимум не в тему.

Исходная версия qnikst, :

main = getargs >>= \(x:_) -> putstrln =<< fmap (case x of "-d" -> go true ; "-e" -> go false ; _ -> error "usage foobar") getcontents
        
go tp d = unlines $ map (unwords . map (fromjust . (`m.lookup` m)) . words) t
  where (m,h,t) | tp =
          let (_,l,m) = foldl' (\(i,l,m) v -> case m.lookup v m of nothing -> (i+1,v:l, m.insert v (show i) m) ; _ -> (i,l,m)) (0,[],m.empty) (words d)
          in (m,l,lines d)                                                              
                | otherwise = (\(a,b) -> (a,[],b)) $ ((m.fromlist . (zip [show x | x <- [0..]]) . words . head) &&& tail)  (lines d)

6 строк :) нормально, с учетом разделения чистых и не-чистых вычислений.