在Haskell中分解多个类型类的简洁方法?

kye*_*kye 7 haskell typeclass

在我的Haskell代码库中,我有许多带有多态参数的函数.这些多态参数都需要满足同一组类型类(RealFloat a, Floating a, Real a, Show a, Ord a, Typeable a),并且这组类型类需要存在于函数的类型注释中.

现在我已经写手动为每个函数的类型类注释,但它得到详细的有类型类的这个列表中我的代码库重复超过30次,麻烦不得不改变各类型的注释,如果我发现我需要添加另一个类型列表.我想知道是否有更简洁的方法来分解一个常见的类型类列表.

我真的想要定义一个"类型类同义词",typeclass NiceFloating a = RealFloat a, Floating a, Real a, Show a, Ord a, Typeable a所以我可以NiceFloating a => a在我的所有类型注释中编写代码.

如果该功能不存在,也许我可以写一个"主类型类",它要求一个值满足类型类列表中的每个类型类?但我不想手工写出Real,Show和Ord等所有操作 - 有没有办法解决这个问题?

chi*_*chi 11

{-# LANGUAGE ConstraintKinds #-}
type NiceFloating a = (RealFloat a, Floating a, Real a, Show a, Ord a, Typeable a)
Run Code Online (Sandbox Code Playgroud)

这定义了想要的NiceFloating :: * -> Constraint.

  • 我也将它升级为一个类.约束同义词也可以减少重复.`type NiceFloating'a =(...); class NiceFloatingC a => NiceFloating a; 实例NiceFloatingC a => NiceFloating a`.有点难看,但是当你需要传递'NiceFloating`时才有用. (3认同)