idris - 在签名中找不到具有约束的实现
问题描述
我有一个依赖于另一个接口的接口,具有一些依赖类型,我无法让编译器在相关函数中约束一个类型
import Data.Vect
interface Distribution (0 event : Nat) (dist : Nat -> Nat -> Type) where
data Gaussian : Nat -> Nat -> Type where
Distribution e Gaussian where
interface Distribution targets marginal =>
Model (targets : Nat) (marginal : Nat -> Nat -> Type) model where
marginalise : model -> Vect s Double -> marginal targets s
foo : m -> Model 1 Gaussian m => Vect s Double -> Nat
foo model x = let marginal = marginalise model x in ?rhs
我明白了
While processing right hand side of foo. Can't find an implementation for Model ?targets ?marginal m.
foo model x = let marginal = marginalise model x in ?rhs
^^^^^^^^^^^^^^^^^^^
这怎么可能?
如果我使用marginalise {marginal=Gaussian} {targets=1} model x
它进行类型检查,但我不明白为什么这还不是由类型签名确定的。
我不认为我问的这个关于同一领域的问题在这里适用
解决方案
我开始写这篇评论作为评论,并在中途意识到它可能是一个完整的答案。
Model 1 Gaussan m
意味着你有一个Model
接口的实现targets = 1
,marginal = Gaussian
和model = m
。然后, let 绑定marginal
requires Model a b m
,即Model
wheretargets = a
和marginal = b
的实现model = m
。但是没有要求a = 1
和b = Gaussian
!
我的猜测是,一旦你阅读了确定参数,你会发现你想要这样的东西:
interface Distribution targets marginal =>
Model (targets : Nat) (marginal : Nat -> Nat -> Type) model | model where
推荐阅读
- angular - [Angular/Ionic],在课堂上调用服务(是的,再次)
- sql-server - 如果数据集为空,则无法通过 SSRS 嵌套报告
- c++ - 为什么“换行”会偏移 .txt 文件中的所有字符字节位置 +1?
- java - 无法从链表中删除元素?
- .net - 使用 PowerShell 将一个 FTP 目录中的所有文件移动到同一服务器上的另一个
- mysql - 如何检查 SQL 表中是否存在一对。约束
- c# - 添加SqlDbType.Text的参数时应该使用什么大小值?
- sql - 查找值 X 未出现在 Y 列中的记录的最有效方法是什么?
- javascript - 使用 JavaScript 和 HTML 随机循环浏览小部件
- tsql - T-SQL 合并与匹配方案中的多个选项