为了账号安全,请及时绑定邮箱和手机立即绑定

从包含“Just”的Maybe返回操作

从包含“Just”的Maybe返回操作

慕雪6442864 2019-09-03 20:06:27
我有一个返回类型为的函数 Maybe ([(Int,Int)],(Int,Int))我想从另一个函数调用它并对数据执行操作。但是,返回值包含在Just。第二种方法需要([(Int,Int)],(Int,Int)),因此不会接受Just ([(Int,Int)],(Int,Int))。Just在应用第二种方法之前,有没有办法可以修剪?我不完全了解使用Just中Maybe-不过,我已被告知,对于第一种方法的返回类型必须是Maybe。
查看完整描述

2 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您的问题有几种解决方案,都基于模式匹配。我假设你有两个算法(因为你没有给它们命名,我会):


algorithm1 :: a -> Maybe b

algorithm2 :: b -> c

input :: a

1)模式匹配通常从case语句(下面)或函数完成。


let val = algorithm1 input

in case val of

    Nothing -> defaultValue

    Just x  -> algorithm2 x

所有其他呈现的解决方案都使用模式匹配,我只是提供了为您执行模式匹配的标准函数。


2)前奏(和Data.Maybe)有一些内置的函数来处理Maybes。在 可能的功能是一个伟大的,我建议你使用它。它在标准库中定义为:


maybe :: c -> (b -> c) -> Maybe b -> c

maybe n _ Nothing  = n

maybe _ f (Just x) = f x

您的代码如下所示:


maybe defaultValue algorithm2 (algorithm1 input)

3)由于Maybe是一个仿函数,你可以使用fmap。如果您没有默认值,这会更有意义。定义:


instance  Functor Maybe  where

    fmap _ Nothing       = Nothing

    fmap f (Just a)      = Just (f a)

所以你的代码看起来像:


fmap algorithm2 (algorithm1 input)

此输出将是一个Maybe值(Nothing如果算法1的结果是Nothing)。


4)最后,强烈劝阻,是fromJust。只有在你肯定第一个算法将返回Just x(而不是Nothing)时才使用它。小心!如果你fromJust val在val = Nothing那时调用,你会得到一个异常,这在Haskell中是不受欢迎的。其定义:


fromJust          :: Maybe b -> b

fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck

fromJust (Just x) = x

让您的代码看起来像:


algorithm2 (fromJust (algorithm1 input))


查看完整回答
反对 回复 2019-09-03
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

你在找fromJust。但只有你确定你的Maybe功能不会返回Nothing!


查看完整回答
反对 回复 2019-09-03
  • 2 回答
  • 0 关注
  • 439 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信