首页 > 解决方案 > 约束依赖类型的集合以匹配 args 和 return

问题描述

我想编写一个函数,它接收一个依赖类型的集合(我不太在意哪种类型),并返回另一个相同类型但可能具有不同值的集合。元素的形式

data Tensor : (Vect r Nat) -> Type where

例如,一个接受(Tensor [2, 3, 4], Tensor [2], Tensor [])or(Tensor [3],)并返回相同类型值的函数。

我试过的

标签: idrisdependent-type

解决方案


您可以编写一个由所有 s 的完整形状索引的函数Tensor,而不仅仅是其中的任何一个。每个的形状Tensor是 a List Nat,所以它们列表的形状是 a List (List Nat)

import Data.Vect 

data Tensor : (Vect r Nat) -> Type where

data Tensors : List (List Nat) -> Type where
  Nil : Tensors []
  Cons : Tensor (fromList ns) -> Tensors nss ->  Tensors (ns :: nss)

这是一个形状保持map功能的示例:

mapTensors 
  : ({0 r : Nat} -> {0 ns : Vect r Nat} -> Tensor ns -> Tensor ns) -> 
  Tensors nss -> Tensors nss
mapTensors f Nil = Nil
mapTensors f (Cons t ts) = Cons (f t) (mapTensors f ts)

推荐阅读