2014-12-05 99 views
1

在C,在字符串中讀取數據,並把它的數據轉換成結構是相當簡單的,你只是使用的東西沿着sscanf線來分析你的數據:如何在Haskell中將字符串解析爲記錄?

struct ingredient_dose ingr; 

char *current_amount = "5 tsp sugar"; 

sscanf(current_amount, "%d %s %s", &ingr.amount, ingr.unit, ingr.ingredient); 

這將填補結構/記錄給定的數據。

我如何在Haskell中做類似的事情?我意識到你不能改變任何東西,所以程序顯然會與C示例有點不同,但我似乎無法找到一個不包含解析JSON的體面指南。

+0

推導閱讀類。如果字符串以Haskell語法給出(例如,Ingr 5「tsp」「sugar」),您可以讓GHC爲您做。 – Mephy 2014-12-05 16:17:49

回答

4

Haskell沒有任何內置功能正好什麼scanf

但是,如果你的東西是空間分隔的,你可以很容易地使用words字符串分割成塊,和read功能,每個子轉換成Int或什麼的。

parse :: String -> (Int, String, String) 
parse txt = 
    let [txt1, txt2, txt2] = words txt 
    in (read txt1, txt2, txt3) 

什麼哈斯克爾確實已經是「真正」的解析器建設圖書館的豐富,解析複雜的東西一樣......嗯...... JSON。 (或者其他任何計算機語言。)因此,如果您的輸入比這更復雜,那麼學習解析器庫通常是一種方法。


編輯:如果您有類似

data IngredientDose = IngredientDose {amount :: Double, unit, ingredient :: String} 

那麼你可以做

parse :: String -> IngredientDose 
parse txt = 
    let [txt1, txt2, txt2] = words txt 
    in IngredientDose {amount = read txt1, unit = txt2, ingredient = txt3} 
+0

這並沒有解釋我怎麼把它放到我的記錄中去.. – 2014-12-07 12:47:03

+0

增加了記錄的例子。 – MathematicalOrchid 2014-12-09 09:11:32