type Operator = Double -> Double -> Double type Entry = (String, Operator) type Register = [Entry] operatorRegister :: Register operatorRegister = [ ("+", (+)), ("*", (*)) ] main = print $ calculate "2 * 5 + 5" calculate :: String -> Double calculate = eval operatorRegister . words eval :: Register -> [String] -> Double eval _ [number] = read number eval ((operator, function):rest) unparsed = case span (/=operator) unparsed of (_, []) -> eval rest unparsed (beforeOperator, afterOperator) -> function (eval operatorRegister beforeOperator) (eval operatorRegister $ drop 1 afterOperator)main = putStrLn "Hello world"main = print (1 + 1)main = print (1 + 1)main = print (words "1 + 5 * 2")a list of strings = [String] a integer = Int a function that takes a integer and returns a string = Int -> String a tuple of one integer and one string = (Int, String)type Operator = Double -> Double -> Double type Entry = (String, Operator) type Register = [Entry]operatorRegister :: Register -- The :: operator means 'is of type' operatorRegister = [ ("+", (+)), ("*", (*)) ]calculate :: String -> Double calculate = undefinedcalculate :: String -> Double -- operatorRegister is the register we defined before. calculate = eval operatorRegister . words eval :: Register -> [String] -> Double eval = undefinedeval :: Register -> [String] -> Double eval _ [number] = read number eval ((operator, function):rest) unparsed = case span (/=operator) unparsed of (_, []) -> eval rest unparsed (beforeOperator, afterOperator) -> function (eval operatorRegister beforeOperator) (eval operatorRegister $ drop 1 afterOperator)