簡體   English   中英

Haskell中兩個不相關類型之間的大小寫

[英]Case between two unrelated types in Haskell

是否可以在Haskell中的兩個不相關類型之間使用case表達式,就像在這個示例(不工作)代碼中一樣:

data A = A
data B = B

f x = case x of
  A -> 1
  B -> 2

main = do
  print $ test A
  return ()

我知道我可以在這里使用Either ,但是這段代碼並不打算使用 - 我想深入學習Haskell類型系統並看看可以做些什么。

AB是不同的類型。 如果您想要一個可以獲取多種類型值的函數,則需要一個類型類。

data A = A
data B = B

class F a where
  f :: a -> Int

instance F A where
  f _ = 1

instance F B where
  f _ = 2

main = do
  print $ f A

不,這對於正常的case語句是不可能的,但是你可以使用類型類來破解這種事情:

data A = A
data B = B

class Test a where
    test :: a -> Int

instance Test A where test = const 1
instance Test B where test = const 2

main = print $ test A

但是你應該只使用它,如果真的需要它,因為它很快會變得混亂,你最終需要對類型系統進行大量擴展(UndecidableInstances,OverlappingInstances,...)

您可以使用具有ghc支持的Typeable類,而不是為f編寫自己的類型類。 您不需要在此處使用Dynamic,但在某些情況下需要使用Dynamic。

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Dynamic

data A = A deriving (Typeable)
data B = B deriving (Typeable)

f x | Just A <- fromDynamic x = 1
    | Just B <- fromDynamic x = 2

f2 x | Just A <- cast x = 1
     | Just B <- cast x = 2

main = do
  print $ f (toDyn A)
  print $ f2 A

暫無
暫無

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

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