haskell - 递归类型的约束
问题描述
我有一个类型data A a = B (a (A a))
。如何对a
函数中的类型 var 施加约束something :: Eq (a b) => A a -> SomeType
?
解决方案
我并不完全清楚你想要实现什么,但这可以编译:
{-# 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
应该可以工作,即使它会触发警告。
推荐阅读
- python - QStyledItemDelegate 的选项没有更新
- javascript - Eloquent Javascript 一书中第 181 页第 11 章:异步编程中给出的图表中的差距是什么意思?
- javascript - JSON文件数据未使用javascript显示在html表中
- watchkit - WatchKit 问题:我的 IBOutlets 标题设置不同步
- spring-boot - 如何在通过 CommandLineRunner 插入值时删除 ID 字段
- python - Conv-Variational-Autoencoder Loss 为 NaN
- kubernetes - Kubernetes 简单的声明式管理
- sqlite - gcloud 使用 sqlite 数据库部署而不被清除
- vb.net - VB.NET System.IndexOutOfRangeException:'索引超出了数组的范围。'
- python - NameError:名称“lopp”未定义