#haskell
#haskell
Вопрос:
Описание проблемы
-
Я использовал следующий код для доступа к списку кортежей, я не понимаю, почему я получаю эту ошибку…
-
также я хотел бы знать, предоставил ли я execas,
mn::[(1,2,3),(6,7,8)]
как я могу получить доступ к(6,7,8)
?
Чистая функция
type rty= [(Int,Int,Int)]
mn::rty->Int
mn (a,b,c) = a
Сообщение об ошибке
Type error in explicitly typed binding
*** Term : (a,b,c)
*** Type : (a,b,c)
*** Does not match : rty
Ответ №1:
rty — это то же самое, что [(a, b, c)]
список. Вы сопоставляете с кортежем вместо списка. Может быть, то, что вы хотите, это:
mn [] = ?
mn ((a, b, c):xs) = ?
Ответ №2:
-
Шаблон
(a,b,c)
соответствует тройкам, а не спискам троек (rty
). -
Если вы хотите получить доступ ко второму элементу в списке троек, вам придется использовать какое-либо рекурсивное решение (явное или через библиотечную функцию). Это скорее зависит от того, что
mn
предполагается делать.
Ответ №3:
Вы пытаетесь сопоставить один кортеж, но не список кортежей. Я бы посоветовал вам изменить тип:
mn :: (Int,Int,Int) -> Int
mn (a,_,_) = a
Чтобы получить доступ к n-му элементу списка, используйте (!!)
как в xs !! 2
. Пожалуйста, обратите внимание, что функция небезопасна. Это означает, что если список слишком короткий, генерируется исключение.
Ответ №4:
type rty = [(Int,Int,Int)]
mn ::rty -> Int
mn ((a,b,c):xs) = a
Поскольку rty представляет собой список кортежей, вы должны получить кортеж из rty, а затем вернуть его.