16

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

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

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

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

我不完全理解Justwithin的使用Maybe——但是,有人告诉我第一个 Method 的返回类型必须是Maybe.

4

2 回答 2

51

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

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功能很棒,我建议你使用它。 它在标准库中定义为:

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如果 algorithm1 的结果是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))
于 2010-07-30T22:07:03.277 回答
5

你正在寻找fromJust. 但前提是你确定你的Maybe函数不会返回一个Nothing

于 2010-07-30T21:35:00.633 回答