2014-11-23 48 views
1

如何將輸入字符串分爲兩部分,其中第一部分是函數,第二部分是參數。我想在Haskell中使用case語句來調用函數。分隔輸入字符串並使用case語句調用所需功能

例如:我有一個函數sum它計算列表中元素的總和,如果用戶寫入sum 9它必須計算列表的前9個元素的總和。

+0

更好地包含您的嘗試代碼? – HaveNoDisplayName 2014-11-23 00:48:01

+0

您是否試圖在運行時解釋Haskell中Haskell片段的字符串?這個問題並不清楚。輸入是否需要懶惰(即,用戶可以一行一行地輸入並實時獲得答案)。我認爲我們需要更多信息。 – jamshidh 2014-11-23 01:15:07

+0

有一個通過遞歸函數生成的列表,然後用戶只是告訴他想要執行的函數,然後用參數輸入一個空格。輸出一旦輸入,就會給出。如果用戶輸入的命令執行不匹配任何給定的函數,它會拋出一個錯誤 – bashxx 2014-11-23 01:31:26

回答

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

使用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> 
相關問題