首页 > 解决方案 > 递归类型的约束

问题描述

我有一个类型data A a = B (a (A a))。如何对a函数中的类型 var 施加约束something :: Eq (a b) => A a -> SomeType

标签: haskelltypesconstraintsrecursive-type

解决方案


我并不完全清楚你想要实现什么,但这可以编译:

{-# LANGUAGE QuantifiedConstraints, StandaloneDeriving, UndecidableInstances #-}

data A a = B (a (A a))

deriving instance (forall t. Eq t => Eq (a t)) => Eq (A a)

something :: (forall t. Eq t => Eq (a t)) => A a -> String
something x 
   | x==x      = "hello"
   | otherwise = "world"

这里的诀窍是要求Eq (a t)任何可能的t. 这需要QuantifiedConstraints.

当然,你也可以使用更温和的方法,用 require 代替

something :: Eq (a Bool) => A a -> String

但这不允许您==在论点上使用。

或者,

something :: Eq (A a) => A a -> String

应该可以工作,即使它会触发警告。


推荐阅读