我想使用坐标列表 [Haskell]

I want to work with a list of coordinates [Haskell]

所以我需要使用坐标列表,我已经制作了这样的类型:

type Pont = (Float, Float)

我需要 return 根据我得到的点数计算出的浮点数列表。 到目前为止我做了什么:

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)

模式 0.0 位于:

szamol <b>0.0</b> = 0.0

没有意义。 Pont PointFloat 的二元组,而不是单个 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)会给你10的平方根(所以约3.16),不会计算平方和的平方根。

因此您可能想使用:

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

在你的 ossz 函数中,你犯了三个错误:

  1. 这里的return类型应该是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 and map :: (a -> b) -> [a] -> [b]:

的组合可能会更好
ossz :: [Pont] -> Float
ossz = <b>sum</b> . <b>map</b> szamol

编辑:如果你想return一个Float的列表,那么你可以映射:

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

或显式递归:

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