在 Haskell 中获取 Maybe 的值

Get value of Maybe in Haskell

我正在实现一个使用 anotherFunction 的函数 myFunction

anotherFunction是外部函数,不能修改。它 return 是 Maybe.

类型的值

myFunction 是一个递归函数,它检查由另一个 myFunction 编辑的值 return 是 Just 值还是 Nothing。如果它是 Nothing 则 return Nothing,否则它将使用由 myFunction 编辑的纯值 return 作为 anotherFunction 的参数。

基本上是这样的:

--These cannot be modified

data A = B | F a

anotherFunction :: x -> Maybe x
--Something here

myFunction :: A -> Maybe x 

--These can be modified
myFunction (F a) = {- if (myFunction a == Nothing) 
                        then Nothing 
                        else anotherFunction (pure value of (myFunction a)) -}

如何实现?

您将无法使用 ==,除非您在签名中有约束条件 Eq a => Maybe a。做这类事情的最好方法是使用 case 语句:

case m of
    Just x -> anotherFunction x
    Nothing -> Nothing

这种模式对于 Maybe 来说非常常见,它形成了 MaybeMonad 实例,为您提供了函数 return x = Just xf >>= x = case x of Just a -> f a; Nothing -> Nothing

您可以使用 case:

匹配从 MyFunction 返回的值
case (myFunction a) of
  Nothing -> Nothing
  Just x -> anotherFunction x

然而更简洁的方法是使用 >>=:

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
myFunction (f a) = (myFunction a) >>= anotherFunction

或者您可以使用 do 表示法:

myFunction (f a) = do
  x <- myFunction a
  anotherFunction x

假设您有 fg,它们都产生包装到类型 Maybe 中的值(Just 3Just "three"Nothing) .您可以像这样组合两者:

import Control.Monad

f :: a -> Maybe b -- suppose these two are signatures of the given two functions
g :: b -> Maybe c

h :: a -> Maybe c -- this is the way you pass values from one
h = f >=> g       -- to the other and bail out when you see Nothing

我为类型 abc 使用了方便的名称以使组合更清晰,但请注意类型不是约束和 a在一个签名中与另一个签名中的a无关,实际类型在具体上下文中使用这两个函数时决定。

由于您似乎没有对 F a 构造函数中的 a 施加任何限制,我想您希望它可能与 A 不同。在这种情况下,函数 myFunction 不能具有类型 A -> ... 因为您正试图将 a 作为参数传递。