Lo prometido es deuda. Siguiendo con el escrito anterior, aquí está el código que resuelve el problema, pero ahora en Haskell:
import qualified Data.ByteString as B
import qualified Data.ByteString.UTF8 as U
import System.Environment(getArgs)
import Data.List
import Data.Maybe
main = do
putStrLn "Write the sequence you want to analyze:"
B.getLine >>= processArguments
processArguments :: B.ByteString -> IO ()
processArguments xs = findUniques $ U.toString xs
findUniques = printUniques . findUniques'
findUniques' :: (Eq a, Show a) => [a] -> [(a,Int)]
findUniques' xs = let uniques = filter (\i -> countInstances i xs == 1) $ nub xs
in [(x,y) | x <- uniques, y <- mapMaybe (\i -> i `elemIndex` xs) [x]]
printUniques :: (Eq a, Show a) => [(a,Int)] -> IO ()
printUniques [] = putStrLn "All instances are the same"
printUniques us = mapM_ putStrLn $ map (\c → ((("Unique instance: " ++ ) $ show $ fst c) ++ ) $ ((" in position " ++ ) $ show $ (+1) $ snd c)) us
countInstances :: (Eq a, Show a) => a -> [a] -> Int
countInstances _ [] = 0
countInstances c (x:xs)
| c == x = 1 + countInstances c xs
| otherwise = countInstances c xs
Es un hecho que puedo usar un where en la definición de printUniques, pero bueno, el caso es que funciona:
mmedina@yggdrasil-m:~/Programming/Haskell/FindDifference$ ./fdc Write the sequence you want to analyze: 麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈塵麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈麈 Unique instance: '\22645' in position 66
Todo muy bonito, sí. Pero entonces: ¿para qué tanto código en Haskell? Explico:
Continue reading “Encuentra la diferencia – versión Kanji – en Haskell”
