好奇,似乎在声明一个名字时,我们总是指定一些有效值,比如让a = 3.问题是,在命令式语言中包括c/java,总是有一个关键字"null".Haskell有类似的东西吗?什么时候函数对象可以为null?
lef*_*out 13
这里是一个"空"值,你可以使用任何类型的变量.它被称为⟂(发音为bottom).我们不需要关键字来生成底值; 实际上⟂是任何不终止的计算的值.例如,
bottom = let x = x in x -- or simply `bottom = bottom`
Run Code Online (Sandbox Code Playgroud)
将无限循环.故意这样做显然不是一个好主意,但你可以undefined用作"标准底价值".这可能是Haskell与Java null关键字最接近的事情.
但是你肯定不应该/不能在Java程序员抓住的大多数应用程序中使用它null.
你知道吗?Haskell不允许这样做真的很好!在Java中,您经常需要警惕值可能为null.在Haskell中,如果某个值低于某些值,那么这将永远不会成为您可能需要检查的预期行为的一部分.如果某些值意图可能没有定义,则必须始终通过将类型包装在a中来使其显式化Maybe.通过这样做,您确保任何试图使用该值的人必须首先检查它是否在那里.不可能忘记这一点并在运行时遇到空引用异常!
而且因为Haskell非常善于处理变量类型,所以检查一个Maybe包含值的内容实际上并不太麻烦.您可以使用模式匹配明确地执行此操作,
quun :: Int -> String
quun i = case computationWhichMayFail i of
Just j -> show j
Nothing -> "blearg, failed"
computationWhichMayFail :: Int -> Maybe Int
Run Code Online (Sandbox Code Playgroud)
或者你可以使用Maybe属于仿函数的事实.事实上,这几乎是每个具体的函数子类的实例:Functor,Applicative,Alternative,Foldable,Traversable,Monad,MonadPlus.它也将半群提升为幺半群.
你不需要知道这些东西到底是什么.但是当你学会了他们所做的事情时,你将能够编写非常简洁的代码,以正确的方式自动处理缺失值,没有错过支票的风险.
† 因为Haskell很懒,所以通常不需要推迟以后再进行任何计算.编译器会自动查看计算是否在必要时完成,并且不久就完成了.
Haskell中没有null.你想要的是Maybemonad.
data Maybe a
= Just a
| Nothing
Run Code Online (Sandbox Code Playgroud)
Nothing是指经典的null并Just包含一个值.
然后,您可以对其进行模式匹配:
foo Nothing = Nothing
foo (Just a) = Just (a * 10)
Run Code Online (Sandbox Code Playgroud)
或者使用case语法:
let m = Just 10
in case m of
Just v -> print v
Nothing -> putStrLn "Sorry, there's no value. :("
Run Code Online (Sandbox Code Playgroud)
或使用该类型类的实例所提供的supperior功能Functor,Applicative,Alternative,Monad,MonadPlus和Foldable.
这可能看起来像这样:
foo :: Maybe Int -> Maybe Int -> Maybe Int
foo x y = do
a <- x
b <- y
return $ a + b
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用更一般的签名:
foo :: (Monad m, Num a) => m a -> m a -> m a
Run Code Online (Sandbox Code Playgroud)
这使得此功能适用于任何能够提供功能的数据类型Monad.所以,你可以用foo用(Num a) => Maybe a,(Num a) => [a],(Num a) => Either e a等.
Haskell没有“ null”。这是一个设计功能。它完全避免了由于空指针异常而导致代码崩溃的任何可能性。
如果您查看使用命令式语言编写的代码,则99%的代码期望填充永远不会为空,如果将其设置为空,则将导致灾难性的故障。但是,然后有1%的代码确实期望为空,并使用此功能指定可选参数或其他内容。但是,通过查看代码,您无法轻易分辨出哪些部分期望将null作为合法参数,而哪些部分则没有。希望它已记录在案-但不要屏住呼吸!
在Haskell中,没有null。如果该参数声明为Customer,那么那里必须有一个实际的,真实的Customer。您不能只是传递一个空值(有意或错误地传递)。因此,期望真实代码的99%Customer总是可以使用。
但是其他的1%呢?好吧,为此,我们有Maybe。但这是一个明确的事情;您必须明确地说“此值是可选的”。并且您必须明确检查何时使用它。您不能“忘记”检查;它不会编译。
因此,是的,没有“ null”,但是有一些Maybe相似但更安全。
| 归档时间: |
|
| 查看次数: |
3844 次 |
| 最近记录: |