[英]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类型系统并看看可以做些什么。
A
和B
是不同的类型。 如果您想要一个可以获取多种类型值的函数,则需要一个类型类。
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.