проблема с явно типизированной привязкой в Haskell

#haskell

#haskell

Вопрос:

Описание проблемы

  1. Я использовал следующий код для доступа к списку кортежей, я не понимаю, почему я получаю эту ошибку…

  2. также я хотел бы знать, предоставил ли я 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:

  1. Шаблон (a,b,c) соответствует тройкам, а не спискам троек ( rty ).

  2. Если вы хотите получить доступ ко второму элементу в списке троек, вам придется использовать какое-либо рекурсивное решение (явное или через библиотечную функцию). Это скорее зависит от того, что 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, а затем вернуть его.