【发布时间】: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中从model到marginal或targets没有fundep,foo中marginal的类型不受任何限制(其类型为marginal targets s可以选择marginal、targets和s),因此没有理由选择targets和marginal中的任何特定选项,因为您碰巧有一个特定实例对应一个特定实例范围内的选择。 -
@Cactus 好的,谢谢。似乎 idris 中的约束与它们在 python/scala 中的工作方式完全不同。您也谈论“在范围内有一个实例”而不是约束,好像
Model 1 Gaussian m =>并不是真正的约束。我说对了吗?如果是这样,我该如何做这样的约束?
标签: idris