在这一段代码中,我的编译器在输入该行时抛出解析错误
tuple_up parsed_int list_of_points
和
let new_point = ((fst last_point), (snd last_point) + 1)
从之前关于这些错误的帖子中,他们建议检查前面的空格,我做到了。所有行都使用制表符正确缩进。似乎这个问题与第一行"让"之后的事情有关?
go_up :: [String] -> [(Int, Int)]
go_up string_path list_of_points =
let parsed_int = parse_current string_path
tuple_up parsed_int list_of_points
tuple_up :: Int -> [String] -> [(Int, Int)]
tuple_up 0 list_of_points = list_of_points
tuple_up increment list_of_points =
let last_point = tail list_of_points
let new_point = ((fst last_point), (snd last_point) + 1)
let new_list_of_points = list_of_points ++ new_point
tuple_up (increment - 1) new_list_of_points
在do
之外,let
的工作方式与内部略有不同。特别:
- 它需要一个
in
。正确的语法是let x = y in z
- 可以绑定多个值,但每个值都必须具有相应的
in
或没有单独的let
将这些要点应用于您的代码:
go_up :: [String] -> [(Int, Int)]
go_up string_path list_of_points =
let parsed_int = parse_current string_path
in tuple_up parsed_int list_of_points
tuple_up :: Int -> [String] -> [(Int, Int)]
tuple_up 0 list_of_points = list_of_points
tuple_up increment list_of_points =
let last_point = tail list_of_points
new_point = ((fst last_point), (snd last_point) + 1)
new_list_of_points = list_of_points ++ new_point
in tuple_up (increment - 1) new_list_of_points
在此之后,您将得到另一个错误,因为last_point
不是一个点,而是一个列表(查看tail
的定义(,这意味着您无法对它应用fst
和snd
。
在那之后,你会得到另一个错误,因为你的类型签名说list_of_points
是一个String
列表,但随后你试图把它的元素当作元组。