从包含"Just"的Maybe返回操作

Kee*_*ish 15 monads haskell maybe

我有一个返回类型为的函数 Maybe ([(Int,Int)],(Int,Int))

我想从另一个函数调用它并对数据执行操作.

但是,返回值包含在Just.第二种方法需要([(Int,Int)],(Int,Int)),因此不会接受Just ([(Int,Int)],(Int,Int)).

Just在应用第二种方法之前,有没有办法可以修剪?

我不完全了解使用JustMaybe-不过,我已被告知,对于第一种方法的返回类型必须是Maybe.

Tho*_*son 49

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

algorithm1 :: a -> Maybe b
algorithm2 :: b -> c
input :: a
Run Code Online (Sandbox Code Playgroud)

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

let val = algorithm1 input
in case val of
    Nothing -> defaultValue
    Just x  -> algorithm2 x
Run Code Online (Sandbox Code Playgroud)

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

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

maybe :: c -> (b -> c) -> Maybe b -> c
maybe n _ Nothing  = n
maybe _ f (Just x) = f x
Run Code Online (Sandbox Code Playgroud)

您的代码如下所示:

maybe defaultValue algorithm2 (algorithm1 input)
Run Code Online (Sandbox Code Playgroud)

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

instance  Functor Maybe  where
    fmap _ Nothing       = Nothing
    fmap f (Just a)      = Just (f a)
Run Code Online (Sandbox Code Playgroud)

所以你的代码看起来像:

fmap algorithm2 (algorithm1 input)
Run Code Online (Sandbox Code Playgroud)

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

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

fromJust          :: Maybe b -> b
fromJust Nothing  = error "Maybe.fromJust: Nothing" -- yuck
fromJust (Just x) = x
Run Code Online (Sandbox Code Playgroud)

让您的代码看起来像:

algorithm2 (fromJust (algorithm1 input))
Run Code Online (Sandbox Code Playgroud)

  • 我反过来说:模式匹配是处理"可能"结果的规范方式,其他只是常用方法的缩写.(由于OP可能不知道它们,我也会说出它们的定义.) (3认同)

Ste*_*hen 5

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

  • fromJust被认为是Haskell中的坏形式 - 就像`head`这样的部分函数.我会在TomMD的答案中推荐其中一种替代方案. (12认同)