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