如何将字符串解析为Haskell中的记录?

时间:2014-12-05 16:10:53

标签: haskell

在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的体面指南。

1 个答案:

答案 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}