在C中,读取字符串中的数据并将其数据放入结构中非常简单,只需使用sscanf
行的内容来解析数据:
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 :(得分:4)
Haskell没有任何内置函数可以完全 scanf
做什么。
但是,如果你的东西是以空格分隔的,你可以轻松地使用words
将字符串拆分成块,并使用read
函数将每个子字符串转换为Int
或其他
parse :: String -> (Int, String, String)
parse txt =
let [txt1, txt2, txt2] = words txt
in (read txt1, txt2, txt3)
Haskell 所拥有的有多少是真实的"解析器构造库,用于解析复杂的东西,比如......好...... 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}