【问题标题】:Understanding 'maybe' in haskell在haskell中理解“也许”
【发布时间】:2017-03-25 15:29:03
【问题描述】:

假设我们有一个函数 sqrt 的示例,它为我们提供浮点数的平方根,但不会在负输入时中止。那么 sqrt 的类型是什么。

有人告诉我答案是:

sqrt :: Maybe Float -> Float

但是我不明白 Maybe 做了什么,它只是意味着我们可以提供任何东西作为输入还是意味着其他东西。

【问题讨论】:

  • A Maybe 是参数化类型。现在你知道的和以前一样多。
  • sqrt :: Float -> Maybe Float 听起来更合理。可能有也可能没有有效的结果。这就是 Maybe 类型的意义所在。

标签: haskell types functional-programming maybe


【解决方案1】:

Maybe 是一个类型构造函数,定义简单:

data Maybe a 
    = Just a  
    | Nothing

此语法读作“创建一个名为 Maybe 的新类型构造函数,它接受一个类型参数。它有两个值构造函数:Just 接受一个类型为 aNothing 的单个参数。”

当我们编写接受 Maybe 参数的函数时,我们可以对其进行模式匹配来处理这两种情况。

foo :: Maybe String -> String
foo (Just str) = str
foo Nothing = "There was nothing!"

如果一个函数对所有输入都没有有意义的定义,那么我们可以使用Maybe 来表示。例如,Prelude 中的sqrt 返回负值NaN。我们可以编写一个返回Maybe的不同版本:

import qualified Prelude
import Prelude hiding (sqrt)

sqrt :: Float -> Maybe Float
sqrt x
    | x < 0     = Nothing
    | otherwise = Just (Prelude.sqrt x)  

我们可能会将这种类型读作“如果你给我一个浮点数,那么我也许可以返回一个浮点数。”

【讨论】:

    【解决方案2】:

    我撤回了我的近距离投票,尽管另一个问题的最佳答案或多或少地回答了这个问题,它本身并不是真正的骗局。

    首先,让我们谈谈参数化类型。

    如果我说(语言不可知)

    Array<String>
    

    我们有一个字符串数组。一个字符串数组["foo", "bar"] 具有类型 Array&lt;String&gt;。 'Array' 本身并不是一个完整的类型*,我们有一个 of 的数组。换句话说,我们将 Array 参数化为 String 类型。

    Maybe 也是这样工作的,你有一个(在这种情况下)Maybe Float,它可以是 Just FloatNothing。现在,就像编译器不允许您将整数列表传递给采用 int 的函数一样,它也不允许您将 Maybe T 传递给采用 T 类型的函数。您必须处理 Nothing 案例,类型系统防止省略处理失败案例。所以你的 sqrt 函数应该有签名

    sqrt :: Float -> Maybe Float
    

    为了反映这样一个事实,尽管您可以传入任何浮点数,但如果参数为负数,则结果可能不存在。

    * 出于本次讨论的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多