* Не удалось сопоставить тип `(Float, Float) 'с` [Point]' - PullRequest
0 голосов
/ 13 декабря 2018

КОД

type Point = (Float,Float)
type Candidate = (Point,Point,[Point],Float)


print_list :: [[Point]] -> String
print_list [] = ""
print_list [x:xs] = show x ++ "," ++  print_list(xs)

candidate_to_string :: Candidate -> String 
candidate_to_string (a, x, y:ys, z) = "Start point: " ++ show a ++ 
"\nSupporting Points: " ++  print_list(y:ys) ++ "\nEnd Point: " ++ show x 
++ "\nTime: " ++ show z

СООБЩЕНИЕ ОБ ОШИБКЕ

C:\\Users\conor\Desktop\haskellcoursework.hs:47:50: error:
    * Couldn't match type `(Float, Float)' with `[Point]'
      Expected type: [[Point]]
        Actual type: [Point]
    * In the first argument of `print_list', namely `(xs)'
      In the second argument of `(++)', namely `print_list (xs)'
      In the second argument of `(++)', namely `"," ++ print_list (xs)'
   |
47 | print_list [x:xs] = show x ++ "," ++  print_list(xs)
   |                                                  ^^

C:\\Users\conor\Desktop\haskellcoursework.hs:50:107: error:
    * Couldn't match type `(Float, Float)' with `[Point]'
      Expected type: [[Point]]
        Actual type: [Point]
    * In the first argument of `print_list', namely `(y : ys)'
      In the first argument of `(++)', namely `print_list (y : ys)'
      In the second argument of `(++)', namely
        `print_list (y : ys)
           ++ "\nEnd Point: " ++ show x ++ "\nTime: " ++ show z'
   |
50 | candidate_to_string (a, x, y:ys, z) = "Start point: " ++ show a ++ 
"\nSupporting Points: " ++  print_list(y:ys) ++ "\nEnd Point: " ++ show x ++ 
"\nTime: " ++ show z                   ^^^^
   |                                                                                                           

Используемые мной подписи указаны для меня.Моя задача - написать функцию кандидат_в_строку :: Candidate -> String, которая создает строковое представление кандидата.Каждая точка записывается в отдельной строке, начиная с начальной точки, за которой следуют все опорные точки и заканчивая конечной точкой.Время печатается в дополнительной строке, состоящей из строки «Time:» и значения.

1 Ответ

0 голосов
/ 13 декабря 2018

print_list требует [[Point]] - список списков точек

print_list :: [[Point]] -> String
           -- ^^^^^^^^^ --

, но здесь вы передаете ему [Point] список точек.Следовательно, возникает ошибка типа:

candidate_to_string :: Candidate -> String 
candidate_to_string (a, x, y:ys, z) = 
    ...  print_list(y:ys) ...
                -- ^^^^^^ this is a [Point]

Ошибка в том, что вместо print_list должно быть [Point] -> String.Более подробно,

print_list [x:xs] = show x ++ "," ++  print_list(xs)

неверно, поскольку [x:xs] - это список, содержащий только один элемент, а именно список x:xs.Вам не нужен список списков, поэтому просто используйте что-то вроде

print_list :: [Point] -> String
print_list []     = ""
print_list [x]    = show x   -- we don't want a trailing comma here
print_list (x:xs) = show x ++ "," ++  print_list xs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...