繁体   English   中英

Haskell 模式匹配类型

[英]Haskell pattern match on type

有没有办法在 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

现在我想从水果列表(篮子)中获取“苹果”

from_basket Apple basket

没有明确的模式匹配

case x of
    Apple i -> ...
    Orange i -> ...
    _ ->

一种方法是定义您自己的助手 function isApple然后进行过滤:

isApple (Apple _) = True
isApple _         = False

getApples = filter isApple

模式匹配是您选择的工具,我不知道您是否可以进一步简化它。 但除了一些脏模板 Haskell 之外,我没有看到任何其他方式。

其他答案已经解释了为什么它不能按原样工作,但就替代方案 go 而言,想要做类似的事情通常表明您的数据类型应该看起来更像这样:

data FruitName = Apple | Orange deriving (Eq, Show)
data Fruits = Fruits FruitName Int deriving (Eq, Show)

...在这种情况下,所需的 function 变得微不足道。

您可以通过定义选择器函数来完成类似的事情

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

现在你可以做

> fromBasket getApple basket
Just 2

> fromBasket getOrange basket
Just 4 

这假设您的构造函数都采用类似的 arguments。 如果所需的水果类型不在篮子中,它也会返回Nothing

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM