haskell - 使用具有 'limited' 约束的约束种类和类型族

标签 haskell type-families constraint-kinds

我正在开发一个应用仿函数,其中包含一个用于“查看”执行的幺半群。然而,有时我根本不关心这部分,所以幺半群的选择是无关紧要的,因为它永远不会被消耗。我已经简化了我的内容:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}

import GHC.Exts

class Render a b where render :: a -> b
instance Render a () where render = const ()

class Merge a where
  type Renderer a b :: Constraint
  merge :: Renderer a b => a -> b

data Foo = Foo Bool

instance Merge Foo where
  type (Renderer Foo) m = (Render Bool m)
  merge (Foo b) = render b

Render 用于将各种 a 转换为单个 bMerge 是我的实际仿函数的一个很大的简化,但重点是它包含一个类型系列/约束,我的目的是准确指定 Render 所具有的 >合并需要。

现在,我可能想“运行”Merge,但放弃 View ,这类似于:

runFoo :: Merge a => a -> Int
runFoo x = case merge x of () -> 5

但这会失败,因为:

Could not deduce (Renderer a ()) arising from a use of merge

我选择 () 作为我的幺半群,因为对于所有 a,我们都有一个 Render a () 实例。因此,如果有一种方法可以说 Merge a 仅意味着集合 Render 约束,那么这就可以正常工作。当然,Merge a 比这更通用 - 它可以添加任意约束,这解释了编译错误。

是否有办法在不更改 runFoo 签名的情况下实现我想要的目标?

最佳答案

如果您有很多这样的情况,这可能无法扩展,但这是有效的:

class Renderer a () => Merge a where
  ...

关于haskell - 使用具有 'limited' 约束的约束种类和类型族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158074/

相关文章:

haskell - 如何使括号免受异步异常的影响?

algorithm - 如何正确地将龙格误差估计规则添加到这个例子中?

haskell - GHC 类型家族是系统 F-omega 的一个例子吗?

haskell - Haskell 中数据族的模式匹配

haskell - () 作为空约束

haskell - 更高种类的空约束

haskell - 根据参数和请求的返回类型退回产品或记录的一部分的功能

windows - 在 Windows 上使用堆栈

haskell - 如何将这个封闭类型族与依赖类型类结合起来