在haskell中有没有办法做这样的事情?
data Fruits = Apple Int | Orange Int deriving (Eq, Show)
basket = [Apple 2, Orange 4]
from_basket t (x:basket) =
case x of
(t i) -> i
_ -> from_basket t basket
Run Code Online (Sandbox Code Playgroud)
现在我想从水果清单(篮子)中获取'苹果'
from_basket Apple basket
Run Code Online (Sandbox Code Playgroud)
没有明确的模式匹配
case x of
Apple i -> ...
Orange i -> ...
_ ->
Run Code Online (Sandbox Code Playgroud)
fuz*_*fuz 14
一种方法是定义自己的辅助函数isApple
,然后进行过滤:
isApple (Apple _) = True
isApple _ = False
getApples = filter isApple
Run Code Online (Sandbox Code Playgroud)
模式匹配是您选择的工具,我不知道您是否可以进一步简化此操作.但除了一些脏模板Haskell,我没有看到任何其他方式.
其他答案已经解释了为什么它不会按原样运行,但就替代方案而言,想要做类似的事情通常表明您的数据类型看起来应该更像这样:
data FruitName = Apple | Orange deriving (Eq, Show)
data Fruits = Fruits FruitName Int deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
......在这种情况下,所需的功能变得微不足道.
您可以通过定义选择器功能来完成与此类似的操作
getApple :: Fruits -> Maybe Int
getApple (Apple x) = Just x
getApple _ = Nothing
getOrange :: Fruits -> Maybe Int
getOrange (Orange x) = Just x
getOrange _ = Nothing
fromBasket selector [] = Nothing
fromBasket selector (x:basket) =
case selector x of
Just x -> Just x
Nothing -> fromBasket selector basket
Run Code Online (Sandbox Code Playgroud)
现在你可以做
> fromBasket getApple basket
Just 2
> fromBasket getOrange basket
Just 4
Run Code Online (Sandbox Code Playgroud)
假设所有构造函数都采用类似的参数。Nothing
如果所需的水果类型不在篮子中,它也会返回。