在 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
来说非常常见,它形成了 Maybe
的 Monad
实例,为您提供了函数 return x = Just x
和 f >>= 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
假设您有 f
和 g
,它们都产生包装到类型 Maybe
中的值(Just 3
、Just "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
我为类型 a
、b
和 c
使用了方便的名称以使组合更清晰,但请注意类型不是约束和 a
在一个签名中与另一个签名中的a
无关,实际类型在具体上下文中使用这两个函数时决定。
由于您似乎没有对 F a
构造函数中的 a
施加任何限制,我想您希望它可能与 A
不同。在这种情况下,函数 myFunction
不能具有类型 A -> ...
因为您正试图将 a
作为参数传递。
我正在实现一个使用 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
来说非常常见,它形成了 Maybe
的 Monad
实例,为您提供了函数 return x = Just x
和 f >>= 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
假设您有 f
和 g
,它们都产生包装到类型 Maybe
中的值(Just 3
、Just "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
我为类型 a
、b
和 c
使用了方便的名称以使组合更清晰,但请注意类型不是约束和 a
在一个签名中与另一个签名中的a
无关,实际类型在具体上下文中使用这两个函数时决定。
由于您似乎没有对 F a
构造函数中的 a
施加任何限制,我想您希望它可能与 A
不同。在这种情况下,函数 myFunction
不能具有类型 A -> ...
因为您正试图将 a
作为参数传递。