Как извлечь информацию из пользовательского типа данных

Я новичок в Haskell и функциональном программировании в целом. В настоящее время я изучаю пользовательские типы данных и имею следующее:

data Point = Pt Double Double deriving (Show, Eq)

getValue :: Point -> Double

getValue (Pt a _) = a

Я пытаюсь вернуть только одно из двойных значений из пользовательского типа данных, но столкнулся с проблемой. Моя консоль выдает следующую ошибку всякий раз, когда я пытаюсь извлечь одно из своих значений баллов: «Не удалось сопоставить ожидаемый тип Integer -> Integer -> t». Любые идеи относительно того, что я делаю неправильно?


(редактирование из комментариев OP:) Я набрал следующее в GHCi

test Pt 1.0 1.0

Вот все сообщение об ошибке:

• Couldn't match expected type ‘Integer -> Integer -> t’ 
      with actual type ‘Double’ 
• The function ‘test’ is applied to three arguments, 
      but its type ‘Point -> Double’ has only one 
  In the expression: 
      test Pt 1 1 
  In an equation for ‘it’: 
      it = test Pt 1 1 
• Relevant bindings include 
      it :: t (bound at <interactive>:497:1)

test — это то, что я переименовал в getValue.


person Carlos Romero    schedule 11.10.2019    source источник
comment
Код отлично работает, когда я вставляю его в GHCi. И странно, что сообщение об ошибке, о котором вы сообщаете, упоминает Integers, когда все основные типы в вашем коде — Doubles. Пожалуйста, предоставьте точный код, который вы используете (я подозреваю, что их больше, и настоящая ошибка находится в другом месте).   -  person Robin Zigmond    schedule 12.10.2019
comment
Спасибо, что нашли время, чтобы помочь. К сожалению, то, что я включил в вопрос, - это единственный код, который у меня есть в моем файле .hs. Он компилируется, но когда я пытаюсь запустить тестовую функцию, я получаю указанную ранее ошибку.   -  person Carlos Romero    schedule 12.10.2019
comment
Спасибо за разъяснение - тогда вопрос, что вы делаете, когда запускаете тестовую функцию? Вы имеете в виду ввод какого-то выражения в GHCi? Если да, то какое точное выражение? (Тот факт, что вы включаете только часть сообщения об ошибке — в нем также должен быть указан фактический тип и выражение, в котором произошло несоответствие, — особенно затрудняет догадку о том, что вы могли сделать.)   -  person Robin Zigmond    schedule 12.10.2019
comment
Да, я набрал в тесте GHCi Pt 1.0 1.0 следующее. Извините за всю неясность, я не хотел включать все сообщение, чтобы не включать ненужные символы. Это полное сообщение об ошибке: • Не удалось сопоставить ожидаемый тип «Integer -> Integer -> t» с фактическим типом «Double» • Функция «test» применяется к трем аргументам, но ее тип «Point -> Double» имеет только один В выражении: test Pt 1 1 В уравнении для 'it': it = test Pt 1 1 • Соответствующие привязки включают it :: t (привязка в ‹interactive›:497:1)   -  person Carlos Romero    schedule 12.10.2019
comment
Ну, ты не показал мне, что такое test, но этого достаточно, чтобы понять проблему - ты явно хочешь сделать test (Pt 1.0 1.0). test Pt 1.0 1.0 без круглых скобок интерпретируется как применение функции test к трем аргументам Pt, 1.0 и 1.0, что не имеет смысла, и именно поэтому GHC жалуется.   -  person Robin Zigmond    schedule 12.10.2019
comment
Извините, test — это то, что я переименовал в get_value. Тем не менее, это работает сейчас! Большое спасибо!   -  person Carlos Romero    schedule 12.10.2019
comment
Пожалуйста, включите полную проблему выше, вместо комментариев. Stackoverflow предназначен в первую очередь для будущих читателей, и оставление части описания проблемы в комментариях мешает людям понять, что именно происходит, простым способом.   -  person Michael Litchard    schedule 12.10.2019
comment
@RobinZigmond Я разместил ваш комментарий как ответ CW. если вы решите опубликовать свой собственный ответ, пожалуйста, отправьте мне пинг, чтобы я мог удалить свой пост. :)   -  person Will Ness    schedule 13.10.2019


Ответы (1)


вы явно хотите сделать test (Pt 1.0 1.0).

test Pt 1.0 1.0 без круглых скобок интерпретируется как применение функции test к трем аргументам Pt, 1.0 и 1.0, что не имеет смысла, и именно поэтому GHC жалуется. – Робин Зигмонд, вчера

person Community    schedule 13.10.2019