haskell - 我想使用坐标列表 [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)
解决方案
中的模式0.0
:
szamol 0.0 = 0.0
没有意义。APont
Point
是Float
s 的 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
函数中,你犯了三个错误:
- 返回类型应该在
Float
这里; - 你总结了
(+)
,而不是(++)
and - 列表“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
编辑:如果你想返回一个Float
s 列表,那么你可以映射:
ossz :: [Pont] -> [Float]
ossz = map szamol
或显式递归:
ossz :: [Pont] -> [Float]
ossz [] = []
ossz (h : t) = szamol h : ossz t
推荐阅读
- javascript - 发出在循环中写入文件并从临时目录中读取的问题
- javascript - 在一组字符之前匹配一些东西,直到正则表达式中的一个字符
- c# - 从 SFTP 下载文件的问题?(未处理的异常)
- grep - Show a match (grep) and show one column of the matched line
- node.js - 由于“Module not found: Error: Can't resolve”错误,Webpack 突然无法编译
- python - Jupyter 打印语句问题
- cocoa-touch - ARKit 人脸追踪 PBR
- javascript - 使用 Vue.js 每 5 秒更改一次 innerHTML
- java - 按主键查找与按唯一列查找之间有区别吗?
- google-calendar-api - Gsuite 资源无法与服务帐号共享