Не удается сопоставить ожидаемый тип с фактическим типом, Haskell - PullRequest
0 голосов
/ 11 октября 2018

У меня есть эта ошибка Не удалось найти ожидаемый тип Double -> (Double, Double, Double)' with actual type (Double, Double, Double) , который я не знаю, как исправить, я боролся с этим для некоторыхдни с разными ошибками, и теперь я думаю, что у меня есть, просто нужно это исправить, это мой код:

terna :: Double -> Double -> (Double, Double, Double) terna (x, y) = (x, y, (sqrt ((x*x)+ (y*y))))

Все просто, но я только начинаю с Haskell инайти много камней на моем пути из-за того, что плохо знаком с функциональным программированием.Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Взгляните на заголовок функции:

terna <b>(x, y)</b> = ...

Это шаблон из двух кортежей, а не функции с двумя параметрами (обратите внимание, что, строго говоря, функции имеют один параметр, здесь мы, таким образом, создаем функцию с одним параметром, которая генерирует функцию, которая затем принимает другой параметр, но Haskell предоставляет более удобный синтаксис для этого).

В результате подписьваша функция:

terna :: <b>(Double, Double)</b> -> (Double, Double, Double)
terna (x, y) = (x, y, sqrt (x*x + y*y))

Но обычно в Haskell функции " curry ", поэтому имеет смысл написать это следующим образом:

terna :: <b>Double -> Double</b> -> (Double, Double, Double)
terna <b>x y</b> = (x, y, sqrt (x*x + y*y))
0 голосов
/ 11 октября 2018

Просто избавьтесь от скобок и запятой:

terna x y = (x, y, (sqrt ((x*x)+ (y*y))))

Применение функций в Haskell выполняется с пробелами, а не с круглыми скобками и запятыми, как в большинстве других языков.В частности, компилятор интерпретирует (x, y) как пару (кортеж с 2 значениями), поэтому вы видите ошибку типа.

...