我们主要使用数据来存储值,如下所示:
data Sex = Male | Female
data Person = Person {name :: String, age :: Int, sex :: Sex}
charlie :: Person
charlie = Person "Charlie" 32 Male
现在我们有了很好的函数name
age
和sex
来获取数据值。
但是,通过GADT和Rank2,我们可以做一些更酷的事情:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE Rank2Types #-}
data Sex = Male | Female
data Data a where
Name :: Data String
Age :: Data Int
Sex :: Data Sex
type Person = forall a. Data a -> a
charlie :: Person
charlie Name = "Charlie"
charlie Age = 32
charlie Sex = Male
所以,这真是太棒了。它为我们提供了一个美妙的语法来定义人,并且使用GADT。
但这真的更好吗?这在运行时如何表示?模式匹配在表示中实际上比数据更慢和/或更大吗?
lt; dr :与数据查找相比,模式匹配的速度有多快?
答案 0 :(得分:3)
如果使用-ddump-asm
编译代码,您可以看到模式匹配是一系列比较并跳转到指令中嵌入的数据(加载字符串的地址,加载数字32的常量,等)。
由于间接性,容器(如Map或HashMap)会变慢,但希望很明显,静态命名的变量比遍历(可能是动态的)树结构更快。