如何將輸入字符串分爲兩部分,其中第一部分是函數,第二部分是參數。我想在Haskell中使用case語句來調用函數。分隔輸入字符串並使用case語句調用所需功能
例如:我有一個函數sum
它計算列表中元素的總和,如果用戶寫入sum 9
它必須計算列表的前9個元素的總和。
如何將輸入字符串分爲兩部分,其中第一部分是函數,第二部分是參數。我想在Haskell中使用case語句來調用函數。分隔輸入字符串並使用case語句調用所需功能
例如:我有一個函數sum
它計算列表中元素的總和,如果用戶寫入sum 9
它必須計算列表的前9個元素的總和。
第一個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
使用words
字符串在空間分割。 然後,您可以使用大小寫表達式並匹配函數名稱和參數。 如果你只想打印結果,你可以直接在IO
單子工作, 它允許你用不同的返回類型的函數工作:
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>
更好地包含您的嘗試代碼? – HaveNoDisplayName 2014-11-23 00:48:01
您是否試圖在運行時解釋Haskell中Haskell片段的字符串?這個問題並不清楚。輸入是否需要懶惰(即,用戶可以一行一行地輸入並實時獲得答案)。我認爲我們需要更多信息。 – jamshidh 2014-11-23 01:15:07
有一個通過遞歸函數生成的列表,然後用戶只是告訴他想要執行的函數,然後用參數輸入一個空格。輸出一旦輸入,就會給出。如果用戶輸入的命令執行不匹配任何給定的函數,它會拋出一個錯誤 – bashxx 2014-11-23 01:31:26