Haskell 理解';也许';在哈斯克尔

Haskell 理解';也许';在哈斯克尔,haskell,types,functional-programming,maybe,Haskell,Types,Functional Programming,Maybe,假设我们有一个函数sqrt的例子,它给我们一个浮点数的平方根,但在负输入时不中止。那么sqrt的类型是什么呢 我被告知答案是: sqrt :: Maybe Float -> Float 然而,我不明白Maybe是做什么的,它仅仅意味着我们可以提供任何东西作为输入,还是意味着其他东西。我撤回了我的投票,尽管另一个问题的最高答案或多或少地回答了这个问题,但它本身并不是一个真正的傻瓜 首先,让我们谈谈参数化类型 如果我说(语言不可知论) 为了反映这样一个事实:尽管可以传入任何浮点,但如果参数为

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

我被告知答案是:

sqrt :: Maybe Float -> Float

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

我撤回了我的投票,尽管另一个问题的最高答案或多或少地回答了这个问题,但它本身并不是一个真正的傻瓜

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

如果我说(语言不可知论)

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


*为了这次讨论的目的。

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

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

如果我说(语言不可知论)

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


*出于本讨论的目的。

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

data Maybe a 
    = Just a  
    | Nothing
此语法的内容为“创建一个名为
的新类型构造函数,它可以接受一个类型参数。它有两个值构造函数:
Just
,它接受一个
a
类型的参数,或者
Nothing

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

foo :: Maybe String -> String
foo (Just str) = str
foo Nothing = "There was nothing!"
如果一个函数没有一个对所有输入都有意义的定义,那么我们可以使用
或者
来说明这一点。例如,前奏曲中的
sqrt
返回负值的
NaN
。我们可以编写一个不同的版本,返回
可能

import qualified Prelude
import Prelude hiding (sqrt)

sqrt :: Float -> Maybe Float
sqrt x
    | x < 0     = Nothing
    | otherwise = Just (Prelude.sqrt x)  
导入限定前奏曲
导入前奏隐藏(sqrt)
sqrt::Float->Maybe Float
sqrt x
|x<0=无
|否则=仅(Prelude.sqrt x)

我们可能会将该类型理解为“如果您给我一个float,那么我就可以返回一个float。”

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

data Maybe a 
    = Just a  
    | Nothing
此语法的内容为“创建一个名为
的新类型构造函数,它可以接受一个类型参数。它有两个值构造函数:
Just
,它接受一个
a
类型的参数,或者
Nothing

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

foo :: Maybe String -> String
foo (Just str) = str
foo Nothing = "There was nothing!"
如果一个函数没有一个对所有输入都有意义的定义,那么我们可以使用
或者
来说明这一点。例如,前奏曲中的
sqrt
返回负值的
NaN
。我们可以编写一个不同的版本,返回
可能

import qualified Prelude
import Prelude hiding (sqrt)

sqrt :: Float -> Maybe Float
sqrt x
    | x < 0     = Nothing
    | otherwise = Just (Prelude.sqrt x)  
导入限定前奏曲
导入前奏隐藏(sqrt)
sqrt::Float->Maybe Float
sqrt x
|x<0=无
|否则=仅(Prelude.sqrt x)

我们可以将该类型理解为“如果你给我一个浮点,那么我就可以返回一个浮点。”

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