On 20 April 2014 14:57, S. H. Aegis <shaegis@gmail.com> wrote:
Is there any other ways to use variables outside of the "do-block"?

You can pass the list of names as an argument where it is needed.
 
import Data.List
import Data.List.Split
import Data.Char
import Data.Maybe

main :: IO ()
main = do
    names <- readFile "names.txt"
    print $ sum $ map (\x -> getPosition names x * getScore x) names

getPosition :: [String] -> String -> Int
getPosition names x = fromMaybe 0 (elemIndex x $ sortedNamesList names) + 1

getScore :: String -> Int
getScore xs = sum $ map (\x -> ord x - 64) xs

sortedNamesList :: [String] -> [String]
sortedNamesList names = sort $ nameList names

nameList :: String -> [String]
nameList = split (dropDelims . dropBlanks $ oneOf ",\"")