首页 > 解决方案 > 打印浮点数时从“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

标签: haskell

解决方案


并不是所有的边长组都对应一个真正的三角形。你有两个选择:

  1. 定义一个返回 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)
    
  2. 推荐: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。)


推荐阅读