Я хочу работать со списком координат [Haskell] - PullRequest
0 голосов
/ 05 апреля 2020

Итак, мне нужно поработать со списком координат, я уже создал такой тип:

type Pont = (Float, Float)

И мне нужно вернуть список с плавающей точкой, рассчитанный по полученным мной точкам. Что я сделал до сих пор:

szamol :: Pont -> Float
szamol 0.0 = 0.0
szamol (x,y) = 10^(1/2)*((x^2)+(y^2))

ossz :: [Pont] -> [Pont]
ossz [] = []
ossz (h,t) = szamol h ++ ossz t

это дает мне эту ошибку:

ERROR "Hazi.hs":6 - Cannot justify constraints in explicitly typed binding
*** Expression    : szamol
*** Type          : Pont -> Float
*** Given context : ()
*** Constraints   : (Integral a, Fractional a)

1 Ответ

4 голосов
/ 05 апреля 2020

Шаблон 0.0 в:

szamol <b>0.0</b> = 0.0

не имеет смысла. A Pont Point представляет собой 2-кортеж из Float s, а не один Float, поэтому вы можете определить это как:

szamol :: Pont -> Float
szamol <b>(0.0, 0.0)</b> = 0.0
szamol (x,y) = 10^(1/2)*((x^2)+(y^2))

Использование 10^(1/2) завершится неудачей, так как Оператор ^ ожидает, что второй операнд имеет тип, который является членом класса типов Integral. Вы можете использовать 10**(1/2).

Использование 10**(1/2) даст вам квадрат root из 10 (т.е. ≈ 3.16) и не будет вычислять квадрат root от суммы квадратов.

Таким образом, вы, вероятно, захотите использовать:

szamol :: Pont -> Float
szamol (0.0, 0.0) = 0.0
szamol (x,y) = <b>sqrt (x*x + y*y)</b>

В вашей функции ossz вы допустите три ошибки:

  1. тип возврата должен быть Float здесь;
  2. вы суммируете с (+), а не с (++) и
  3. , конструктор данных для списка "cons" равен (:), а не (,):
ossz :: [Pont] -> <b>Float</b>
ossz [] = []
ossz <b>(h : t)</b> = szamol h <b>+</b> ossz t

Здесь может быть лучше использовать комбинацию sum :: (Foldable t, Num a) => t a -> a и map :: (a -> b) -> [a] -> [b]:

ossz :: [Pont] -> Float
ossz = <b>sum</b> . <b>map</b> szamol

РЕДАКТИРОВАТЬ : если вы хотите вернуть список Float с, то вы можете отобразить:

ossz :: [Pont] -> [Float]
ossz = <b>map</b> szamol

или с явной рекурсией :

ossz :: [Pont] -> [Float]
ossz [] = []
ossz (h : t) = szamol h <b>:</b> ossz t
...