检查两个值是否具有相同的头构造函数

gal*_*ais 6 haskell

我希望能够编写一个函数来检查是否使用相同的头构造函数构建了两个值.这个功能:

  • 数据类型声明的大小不应该是线性的

  • 如果扩展数据类型,应该继续工作

例如,这是不满意的(它是线性的,如果我添加任何额外的构造函数,catchall将使函数无效):

data E = A Int | B String | C

sameCons :: E -> E -> Bool
sameCons t u = case (t, u) of
  (A{}, A{}) -> True
  (B{}, B{}) -> True
  (C{}, C{}) -> True
  _          -> False
Run Code Online (Sandbox Code Playgroud)

在OCaml中,可以使用Obj模块中的不安全函数来完成该操作.我们可以在Haskell中做类似的事情(ghc特定的解决方案也可以)吗?

Ben*_*son 6

如果你愿意得到,Data那么你很高兴.

{-# LANGUAGE DeriveDataTypeable #-}

import Data.Data

data E = A Int | B String | C deriving (Typeable, Data)

sameCons :: E -> E -> Bool
sameCons x y = toConstr x == toConstr y

ghci> sameCons (A 1) (A 3)
True
ghci> sameCons (A 1) (C)
False
Run Code Online (Sandbox Code Playgroud)

  • `sameCons :: Data a => a - > a - > Bool; sameCons =(==)\`on \`toConstr` (6认同)