Ошибка синтаксического анализа при вводе двух функций - Haskell

В этом сегменте кода мой компилятор выдает ошибку синтаксического анализа при вводе строки

tuple_up parsed_int list_of_points

а также

let new_point = ((fst last_point), (snd last_point) + 1)

Из предыдущих сообщений об этих ошибках они рекомендовали проверить предыдущий пробел, что я и сделал. Все строки имеют правильный отступ с табуляцией. Кажется, эта проблема связана с вещами после первой строки «let»?

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

person James Wang    schedule 26.05.2020    source источник
comment
Должно быть let ... in ..., только в блоке do не пишешь in   -  person Willem Van Onsem    schedule 27.05.2020


Ответы (1)


Снаружи do let работает немного иначе, чем внутри. Особенно:

  1. Требуется in. Правильный синтаксис let x = y in z
  2. Можно связать несколько значений, но каждое из них должно либо иметь соответствующий 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, но тогда вы пытаетесь обращаться с его элементами как с кортежами.

person Fyodor Soikin    schedule 27.05.2020