我想使用坐标列表 [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
Point
是 Float
的二元组,而不是单个 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
函数中,你犯了三个错误:
- 这里的return类型应该是
Float
;
- 你总结了
(+)
,而不是 (++)
和
- 列表 "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
所以我需要使用坐标列表,我已经制作了这样的类型:
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
Point
是 Float
的二元组,而不是单个 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
函数中,你犯了三个错误:
- 这里的return类型应该是
Float
; - 你总结了
(+)
,而不是(++)
和 - 列表 "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