use*_*688 0 indexing haskell list
我需要获取may数组类型中元素的位置Array Int Int.我找到了方法elemIndex或find获得了这个位置.我的问题是,我不需要前缀Just 5例如.那我怎么只得到5我的例子中的数字?
要从值中安全地提取Maybe a值,您可以使用模式匹配,如下所示:
case elemIndex 'C' list of
Just n -> "You can find C at position " ++ show n
Nothing -> "There is no C in the list."
Run Code Online (Sandbox Code Playgroud)
这将返回类似的东西
"You can find C at position 2"
Run Code Online (Sandbox Code Playgroud)
要么
"There is no C in the list."
Run Code Online (Sandbox Code Playgroud)
取决于列表中是否有C.
当然,这种模式匹配总是难以编写,因此存在一个被称为maybe完全相同的函数.如果你看一下它的类型签名,你会看到它
maybe :: b -> (a -> b) -> Maybe a -> b
Run Code Online (Sandbox Code Playgroud)
因此,需要类型的"默认值" b,并从功能a到b,并且将返回b.这是否是默认值取决于值是否Maybe a存在Nothing.例如,如果您想检查列表元素是否允许进入18+俱乐部,您可以这样做
maybe False (\n -> n >= 18) (elemIndex 'C' list)
Run Code Online (Sandbox Code Playgroud)
如果索引小于18 或者列表中不存在该元素,则会显示False .如果它确实存在,它将检查它是否大于或等于18,然后返回True.
Just到目前为止我告诉你的是如何以Just安全的方式摆脱它.有时候,你无法摆脱Just刚刚 - 如果你有一个Nothing手而不是你的手,你有时没有明智的价值Just.那么你可以做的就是当它们仍在里面时操纵值Just.例如,要从just中的值中减去15,就可以了
fmap (subtract 15) (Just 23)
Run Code Online (Sandbox Code Playgroud)
将返回
Just 8
Run Code Online (Sandbox Code Playgroud)
所以你看看如何fmap取一个Just something值并将函数应用到something它的一部分,保持Just外部.如果你愿意的话
fmap (subtract 15) Nothing
Run Code Online (Sandbox Code Playgroud)
它只会保留Nothing,所以结果会是
Nothing
Run Code Online (Sandbox Code Playgroud)
Maybe很棒,因为它是一个错误处理系统,迫使你做正确的事情.你只是不能忽略错误的可能性(用Nothing.表示.)另一个常见的错误处理系统很糟糕.该系统是例外系统.没有人会知道你是否公然忽略了可能发生的异常,这是非常不安全的程序的基础.
所以你真的想保持它,Just直到你可以抛弃它,同时Nothing用一些明智的东西取代潜在的价值.
如果你能保证,有没有一个的可能性Nothing值.如果您确定每次调用elemIndex元素时都会在列表中的某个位置,那么可以使用它fromJust.fromJust我会盲目地试图从a中取出一个价值Just,而不会对没有Just那里发生的事情发出谴责.fromJust如果出现问题,将简单地爆炸您的程序(抛出异常).
如您所知,您必须非常小心地使用它.
然而,正如Jedai在评论中指出的那样,即使你不能得到一个Nothing值,最好明确一点.而不是使用fromJust,考虑做类似的事情
fromMaybe (error "The input " ++ show list ++ " shouldn't create a Nothing value!")
(elemIndex 'C' list)
Run Code Online (Sandbox Code Playgroud)
这将爆发一个非常具体的错误信息,指出哪些地方一定出错了.
这当然与模式匹配看起来一样
case elemIndex 'C' list of
Just n -> n
Nothing -> error "The input " ++ show list ++ " shouldn't create a Nothing value!"
Run Code Online (Sandbox Code Playgroud)
只是压缩成标准fromMaybe功能.