sgm*_*man 0 haskell types functional-programming maybe
所以说我们有一个函数sqrt的例子,它给我们一个浮点数的平方根,但不会在负输入上中止.那么sqrt的类型是什么.
我被告知答案是:
sqrt :: Maybe Float -> Float
Run Code Online (Sandbox Code Playgroud)
但是我不明白Maybe的作用是什么,它只是意味着我们可以提供任何输入或者它意味着什么.
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)
我们可能会把这种类型读成"如果你给我一个浮点数,那么我可以返回一个浮点数."