了解haskell中的"可能"

sgm*_*man 0 haskell types functional-programming maybe

所以说我们有一个函数sqrt的例子,它给我们一个浮点数的平方根,但不会在负输入上中止.那么sqrt的类型是什么.

我被告知答案是:

sqrt :: Maybe Float -> Float
Run Code Online (Sandbox Code Playgroud)

但是我不明白Maybe的作用是什么,它只是意味着我们可以提供任何输入或者它意味着什么.

eph*_*ion 6

Maybe 是一个具有简单定义的类型构造函数:

data Maybe a 
    = Just a  
    | Nothing
Run Code Online (Sandbox Code Playgroud)

这个语法读作"创建一个新的类型构造函数,调用Maybe它接受一个类型参数.它有两个值构造函数:Just它接受一个类型的参数a,或者Nothing."

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

foo :: Maybe String -> String
foo (Just str) = str
foo Nothing = "There was nothing!"
Run Code Online (Sandbox Code Playgroud)

如果函数没有对所有输入有意义的定义,那么我们可以Maybe这样说.例如,sqrt在Prelude中返回NaN负值.我们可以编写一个返回的不同版本Maybe:

import qualified Prelude
import Prelude hiding (sqrt)

sqrt :: Float -> Maybe Float
sqrt x
    | x < 0     = Nothing
    | otherwise = Just (Prelude.sqrt x)  
Run Code Online (Sandbox Code Playgroud)

我们可能会把这种类型读成"如果你给我一个浮点数,那么我可以返回一个浮点数."