分离输入字符串并使用case语句调用所需的函数

时间:2014-11-23 00:38:11

标签: haskell

如何将输入字符串分成两部分,第一部分是函数,第二部分是参数。我想在Haskell中使用case语句调用该函数。

例如:我有一个函数sum,它计算列表中元素的总和,如果用户写sum 9,它必须计算列表前9个元素的总和。 / p>

2 个答案:

答案 0 :(得分:1)

第一个import Data.List,它具有所有列表操作功能。 然后在第一个空格处拆分,使用span。然后删除列表后半部分的第一个元素,因为那将是空格。那么代码就是:

import Data.List
f :: String -> (String, String)
f s = (func, tail args)
  where (func, args) = span (/=' ') s
编辑:哦,是的,关于你问题的第二部分。您是不是在运行时将函数添加到可调用函数列表中?所以只需在第一个参数字符串上进行另一个函数和模式匹配,然后调用相应的函数。这只适用于你总是返回int的情况。我不确定如何在泛型返回类型上进行此操作示例:

eval :: (String, String) -> Int
eval ("sum", args) = sum (take (read . head $ args') (read . concat . tail $ words))
  where args' = words args

答案 1 :(得分:1)

使用words在空格处分割字符串。 然后,您可以使用案例表达式并匹配函数名称和参数。 如果您只想打印结果,可以直接在IO monad中工作, 它允许您使用不同返回类型的函数:

evaluationLoop :: IO ()
evaluationLoop = do
  input <- getLine
  case words input of
    "add"    : xs -> (print $ sum $ map read xs) >> evaluationLoop
    "concat" : xs -> (putStrLn $ concat xs)      >> evaluationLoop        
    "exit"   : [] -> return ()

然后您可以像这样使用它:

ghci> evaluationLoop 
add 1 2 3 4 5
15
add -4 14
10
concat a hello 
ahello
concat hi 
hi
exit
ghci>