【问题标题】:Can't find implementation with constraint in signature在签名中找不到具有约束的实现
【发布时间】:2021-08-07 23:01:32
【问题描述】:

我有一个依赖于另一个接口的接口,具有一些依赖类型,我无法让编译器在相关函数中约束一个类型

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 它会进行类型检查,但我不明白为什么这还没有由类型签名确定。

我不认为this qu我问过同样的领域适用于这里

【问题讨论】:

  • Model 中从modelmarginaltargets 没有fundep,foomarginal 的类型不受任何限制(其类型为marginal targets s 可以选择marginaltargetss),因此没有理由选择targetsmarginal 中的任何特定选项,因为您碰巧有一个特定实例对应一个特定实例范围内的选择。
  • @Cactus 好的,谢谢。似乎 idris 中的约束与它们在 python/scala 中的工作方式完全不同。您也谈论“在范围内有一个实例”而不是约束,好像Model 1 Gaussian m => 并不是真正的约束。我说对了吗?如果是这样,我该如何做这样的约束?

标签: idris


【解决方案1】:

我开始写这篇评论作为评论,并在中途意识到它可能作为一个完整的答案。

Model 1 Gaussan m 表示您有一个带有targets = 1marginal = Gaussianmodel = mModel 接口的实现。然后,marginal 的 let 绑定需要Model a b m,即Model 的实现,其中targets = amarginal = bmodel = m。但是没有要求a = 1b = Gaussian

我的猜测是,一旦你阅读了determining parameters,你会发现你想要这样的东西:

interface Distribution targets marginal =>
 Model (targets : Nat) (marginal : Nat -> Nat -> Type) model | model where

【讨论】:

  • 当您说“marginal 的绑定”时,指的是哪一行?我在很多地方都使用过marginal
  • @joel:我的意思是让绑定
  • 这解决了我的问题,谢谢!我还不清楚为什么,但我会阅读更多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 2018-08-18
  • 2020-06-04
相关资源
最近更新 更多