Haskell中如何用函数判断类型变体构造器匹配(无需枚举分支)
实现无需枚举构造器的
matches函数 要实现不手动枚举构造器的构造器匹配判断,可以借助Haskell的Data.Data模块提供的构造器提取功能,只需给你的数据类型派生Data实例即可。
步骤1:启用必要语言扩展
首先启用DeriveDataTypeable扩展,让GHC自动为Foo生成Data实例:
{-# LANGUAGE DeriveDataTypeable #-}
步骤2:导入依赖并定义数据类型
导入Data.Data模块,同时让Foo派生Data和Typeable实例(Typeable是Data的依赖):
import Data.Data data Foo a = A a | B a deriving (Data, Typeable)
步骤3:实现matches函数
利用toConstr函数提取值对应的构造器表示,直接比较两个构造器是否一致:
matches :: (Data a, Data b) => Foo a -> Foo b -> Bool matches x y = toConstr x == toConstr y
效果演示
这个函数会忽略构造器内的参数值,仅判断构造器是否匹配:
matches (B 42) (B undefined)返回Truematches (A "hello") (B 123)返回False- 后续若给
Foo新增构造器(比如C Int),无需修改matches函数,它依然能正确判断构造器匹配情况
原理说明
toConstr函数来自Data.Data模块,可将任何实现Data类型类的值转换为对应的构造器标识。通过比较两个值的构造器标识是否相等,就能实现构造器匹配判断,完全不需要手动枚举每个构造器分支。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

