haskell - 打印浮点数时从“Just 0.631”中删除“Just”
问题描述
我是 Haskell 的新手,我被赋予了返回有效三角形面积的任务。但是,无论何时运行我的代码,它都会打印Just <float>
. 即Just 0.631
。这是我的代码:
triangleArea :: Float -> Float -> Float -> Maybe Float
triangleArea a b c
| a+b>=c && b+c>=a && a+c>=b = Just (sqrt(s*(s-a)*(s-b)*(s-c)))
| otherwise = error "Not a triangle!"
where
s=(a+b+c)/2
解决方案
并不是所有的边长组都对应一个真正的三角形。你有两个选择:
定义一个返回 a 的偏函数
Float
,并调用error
以表示一组无效的长度。不过,这不是Haskell 中推荐的方法。triangleArea :: Float -> Float -> Float -> Float triangleArea a b c | a + b >= c && a + c >= b && a + c >= b = area | otherwise = error "Not a triangle!" where s = (a + b + c) / 2 area = sqrt $ s*(s-a)*(s-b)*(s-c)
推荐:
Maybe Float
用作返回类型,Nothing
当参数没有定义三角形时返回。triangleArea :: Float -> Float -> Float -> Maybe Float triangleArea a b c | a + b >= c && a + c >= b && a + c >= b = Just area | otherwise = Nothing where s = (a + b + c) / 2 area = sqrt $ s*(s-a)*(s-b)*(s-c)
这迫使任何调用
triangleArea
来处理未定义三角形的可能性,而不是简单地使程序崩溃。
(为了完整起见,还有其他选项,即Either SomeType Float
,但它们是 #2 的概括,您可以在其中提供更具体的“错误”值,而不仅仅是Nothing
。)
推荐阅读
- android - Android:如何修复“javax.crypto.AEADBadTagException”?
- next.js - 棱镜模型生成 -
- c++ - 在抛出 'std::system_error 的实例后调用终止
- asp.net-web-api - swagger 不显示使用 IFormfile 和其他参数的上传文件,这是一个对象
- android - 从 Dagger 迁移到 Hilt 时如何提供 Application 类
- php - 需要 HTTP/1.1 426 升级 - Apache2 服务器 (debian 9) 上的 file_get_contents (PHP)
- javascript - React Navigation w/ TypeScript:如何正确输入屏幕参数?类型 object.ts(2339) 上不存在属性 ID
- reactjs - 使用反应图标做出反应的 Onclick 事件
- virtual-machine - 类型 2 管理程序是通过主机操作系统 CPU 调度程序,还是直接与 CPU 交互?
- javascript - 如何从此对象上传图像文件?