如何将输入字符串分成两部分,第一部分是函数,第二部分是参数。我想在Haskell中使用case语句调用该函数。
例如:我有一个函数sum
,它计算列表中元素的总和,如果用户写sum 9
,它必须计算列表前9个元素的总和。 / p>
答案 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>