簡體   English   中英

在Haskell中對我的數據子集進行模式匹配

[英]Pattern matching on a subset of my data in haskell

假設我有一個結構:

data MyType 
  = CV Int 
  | CA MyType MyType
  | CI
  | CD
  | CB

我有一個期望MyType的函數,我只想匹配以下語法子集:

data MyTypeNoCV 
  = CA MyType MyType
  | CI
  | CD
  | CB

我知道這在Haskell中是不可能的。 有沒有一種方法可以對結構進行參數化以某種方式標記節點?

Data.Void可能有幫助嗎?

最簡單的解決方案是僅拆分數據:

data MyTypeNoCV 
  = CA MyType MyType
  | CI
  | CD
  | CB

data MyType
  = CV Int
  | CNonV MyTypeNoCV

如果您想更加花哨,可以使用GADT為數據類型指定索引。 這是一個用Index索引Ty的示例。

{-# LANGUAGE DataKinds, GADTs, KindSignatures #-}

data Index = IsBaz | NotBaz

data Ty :: Index -> * where
  Foo :: Ty NotBaz
  Bar :: Ty NotBaz
  Baz :: Ty IsBaz

f :: Ty NotBaz -> Bool
f Foo = True
f Bar = False

如果您的函數無法處理CV,則可以返回Nothing 這是一個簡化的示例,其中只有2個數據選項,它們可能演示您要完成的任務

data MyType = CV | CA

process :: MyType -> Maybe String
process CV = Nothing
process CA = Just "Got CA!"

main = do
  putStrLn "Processing CA"

  case process CA of
    Nothing -> putStrLn "Nothing"
    Just x -> putStrLn x

  putStrLn "Processing CV"

  case process CV of
    Nothing -> putStrLn "Nothing"
    Just x -> putStrLn x

然后在命令行上:

$ runhaskell script.hs
Processing CA
Got CA!
Processing CV
Nothing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM