首页 > 解决方案 > 我想使用坐标列表 [Haskell]

问题描述

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

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)

标签: haskellcoordinateshugs

解决方案


中的模式0.0

szamol 0.0 = 0.0

没有意义。APont PointFloats 的 2 元组,而不是单个Float,因此您可以将其定义为:

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

使用10^(1/2)将失败,因为^运算符期望第二个操作数是类型类成员的Integral类型。您可以使用10**(1/2).

使用10**(1/2)将为您提供10(so ≈ 3.16) 的平方根,并且不会计算平方和的平方根。

因此,您可能想要使用:

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

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

  1. 返回类型应该在Float这里;
  2. 你总结了(+),而不是(++)and
  3. 列表“cons”的数据构造函数是(:),不是(,)
ossz :: [Pont] -> Float
ossz [] = []
ossz (h : t) = szamol h + ossz t

在这里最好使用sum :: (Foldable t, Num a) => t a -> a和的组合map :: (a -> b) -> [a] -> [b]

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

编辑:如果你想返回一个Floats 列表,那么你可以映射:

ossz :: [Pont] -> [Float]
ossz = map szamol

或显式递归:

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

推荐阅读