首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Idris函数用于构造空的` `List‘,其中`a’被绑定到` of‘的实例中?

Idris函数用于构造空的` `List‘,其中`a’被绑定到` of‘的实例中?
EN

Stack Overflow用户
提问于 2014-07-18 22:20:12
回答 3查看 408关注 0票数 6

我只读过standard tutorial,摸索了一下,所以我可能错过了一些简单的东西。

如果这在伊德里斯是不可能的,请解释原因。此外,如果可以用另一种语言进行操作,请提供一个代码示例,并说明该语言的类型系统有哪些不同之处,从而使其成为可能。

这是我的方法。问题首先出现在第三节。

创建一个已知类型的空列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 v : List Nat
 v = []

这将在REPL中编译并显示为[] : List Nat。太棒了。

概括到任何提供的类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 emptyList : (t : Type) -> List t
 emptyList t = []

 v' : List Nat
 v' = emptyList Nat

不足为奇的是,这是工作和v' == v

约束类型到Ord类的实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : Ord t => (t : Type) -> List t
emptyListOfOrds t = []

v'' : List Nat
v'' = emptyListOfOrds Nat     -- !!! typecheck failure

最后一行出现此错误时失败:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
When elaborating right hand side of v'':
Can't resolve type class Ord t

NatOrd的一个实例,那么问题是什么?我尝试用Nat(不是Ord的实例)替换v''中的Bool,但是错误没有改变。

另一个角度..。

使Ord t成为显式参数是否满足类型检查器?显然不是,但即使它要求调用者传递冗余信息也不是理想的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 emptyListOfOrds' : Ord t -> (t : Type) -> List t
 emptyListOfOrds' a b = []

 v''' : List Nat
 v''' = emptyListOfOrds (Ord Nat) Nat     -- !!! typecheck failure

这一次的错误更加详细:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 When elaborating right hand side of v''':
 When elaborating an application of function stackoverflow.emptyListOfOrds':
         Can't unify
                 Type
         with
                 Ord t

         Specifically:
                 Can't unify
                         Type
                 with
                         Ord t

我可能缺少一些关于如何对照类型声明检查值的关键见解。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-19 02:24:52

正如其他答案所解释的,这是关于变量t的绑定方式和位置。也就是说,当你写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : Ord t => (t : Type) -> List t

阐述者将看到't‘在Ord t中使用时是不绑定的,因此隐含地绑定它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : {t : Type} -> Ord t => (t : Type) -> List t

所以你真正想说的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : (t : Type) -> Ord t => List t

它将在类型类约束之前绑定t,因此当Ord t出现时它在范围内。不幸的是,不支持这种语法。我看不出为什么不应该支持这个语法,但目前它不支持。

你仍然可以实现你想要的,但恐怕它是丑陋的:

由于类是第一类,所以可以将它们作为普通参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : (t : type) -> Ord t -> List t

然后,您可以使用特殊的语法%instance在调用emptyListOfOrds时搜索默认实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
v'' = emptyListOfOrds Nat %instance

当然,您并不想在每个调用站点上都这样做,所以可以使用默认的隐式参数来为您调用搜索过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : (t : Type) -> {default %instance x : Ord t} -> List t
v'' = emptyListOfOrds Nat

如果没有显式提供其他值,default val x : T语法将使用默认值val填充隐式参数x。将%instance设为缺省值与类约束发生的情况基本相同,实际上,我们可能会更改Foo x =>语法的实现,以做到这一点……我认为我没有这样做的唯一原因是,当我开始实现类型类时,default参数还不存在。

票数 8
EN

Stack Overflow用户

发布于 2014-07-18 23:52:58

你可以写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : Ord t => List t
emptyListOfOrds = []

v'' : List Nat
v'' = emptyListOfOrds

或者如果你愿意

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 v'' = emptyListOfOrds {t = Nat}

如果您以您所写的方式要求类型的emptyListOfOrds,您将得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ord t => (t2 : Type) -> List t2

:set showimplicits中的图灵,然后再问一遍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{t : Type} -> Prelude.Classes.Ord t => (t2 : Type) -> Prelude.List.List t2

似乎指定一个Ord t约束会引入一个隐式t,然后您的显式param t将得到一个新的名称。您始终可以显式地为该隐式参数提供一个值,例如emptyListOfOrds {t = Nat} Nat。如果这是出于某种原因的“正确”行为或限制,也许您可以在github上就此打开一个问题?可能与显式类型参数和类型类型约束有冲突吗?通常情况下,当你的事情被隐式解决的时候.虽然我记得有语法可以获得类型实例的显式引用。

票数 2
EN

Stack Overflow用户

发布于 2014-07-18 23:58:07

没有答案,只是一些想法。

这里的问题是,(t : Type)引入了向右扩展的新范围,但是Ord t超出了这个范围:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*> :t emptyListOfOrds 
emptyListOfOrds : Ord t => (t2 : Type) -> List t2

您可以在引入类型变量之后添加类约束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyListOfOrds : (t : Type) -> Ord t -> List t
emptyListOfOrds t o = []

但是现在您需要显式地指定类实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
instance [natord] Ord Nat where
  compare x y = compare x y

v'' : List Nat
v'' = emptyListOfOrds Nat @{natord}

也许以某种方式使Ord t参数隐含是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24837387

复制
相关文章
Python中lambda(),filter(),map()函数
参考链接: Python lambda (匿名函数) | filter, map, reduce
用户7886150
2021/01/12
1K0
如何使用Python的lambda、map和filter函数
Python lambda函数,又称匿名函数,与我们使用def…语句创建的函数不同,可以命名函数,lambda函数不需要名称。当需要一个快速且不需要经常重复使用的(通常是一个小的)函数时,它非常有用。单独使用Lambda函数可能没有太多意义。lambda函数的价值在于它在哪里与另一个函数(例如map()或filter())一起使用。
fanjy
2022/06/04
2.1K0
如何使用Python的lambda、map和filter函数
针对map的lambda
例如原来的: Steam.of(Maps.of("foo", "bar")) .map(e -> e.getKey() + e.getValue()) .findFirst(); 现在 Steam.of(Maps.of("foo", "bar")) .map(SerFunc.entryFunc((key, value) -> key + value)) .findFirst();
阿超
2023/05/22
2190
python map()函数和lambda表达式
python map(fun,[arg]+)函数最少有两个参数,第一参数为一个函数名,第二个参数是对应的这个函数的参数(一般为一个或多个list)。
用户7886150
2021/01/25
6090
lambda与函数式
前面两篇文章介绍了什么是响应式编程?和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。
Java3y
2019/10/23
5270
lambda与函数式
1.3 Hello,reactive world 前面两篇文章介绍了响应式编程和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。 (3)lambda与函数式——响应式Spring的道法术器 这一节,我们先了解一下lambda与函数式(已经了解的朋友可以直接跳到1.3.2),熟悉一下如何使用Reactor进行响应式编程,然后使用Spring Boot2,基于Spring 5的Webflux和Reactive Spring Data逐步开发一个“Hello world”
IT架构圈
2018/06/01
5040
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
在 Python 中 , 使用 def 关键字定义的函数 是 " 具名函数 " , 也就是有名字的函数 ;
韩曙亮
2023/10/11
3390
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
强大的匿名函数lambda使用方法,结合map、apply等
在Python中,lambda的语法形式如下: lambda argument_list: expression lambda是Python预留的关键字,argument_list和expression由用户自定义。
自学气象人
2022/11/14
1.6K0
强大的匿名函数lambda使用方法,结合map、apply等
Python的lambda表达式、filter、map、reduce等函数的用法
参考链接: Python lambda (匿名函数) | filter, map, reduce
用户7886150
2021/01/12
9590
[Python]中filter、map、reduce、lambda的用法
原文链接:http://blog.csdn.net/humanking7/article/details/45950985
祥知道
2020/03/10
6410
[编程经验]Python中的Lambda,Map, Reduce小结
今天要和大家分享的是Python匿名函数(anonymous functions),也叫lambda函数。匿名函数的意思就是说这个函数没有显式的函数名,因为一般在Python中定义函数的时候都是这个样子的,def function_name(参数列表): balabalaba。暂且把具有function_name的函数称作常规函数,而匿名函数就称作lambda函数。匿名函数没有显式的函数名,但是有显式的lambda标志,写了lambda的函数就可以称作匿名函数。一般情况大家不愿意用匿名函数(因为他 们不会用
用户1622570
2018/04/11
8500
python中的zip、lambda、map操作
python 中有几个比较酷炫的操作,比如:zip、lambda、map 一、zip操作 zip字面意思:拉链。这么记,把几个东西扔到一个包里,拉上拉链,就算打包好了。通俗点讲,就是把第1个参数,与第2个参数,按位置1个个对齐,组成一系列元组. x = (1, 2) y = ("a", "b") zip_result = zip(x, y) print(list(zip_result)) x = [4, 5, 6] y = ['d', 'e'] zip_result = zip(x, y) print(
菩提树下的杨过
2018/04/16
1K0
lambda函数
lambda函数就是我们常说的匿名函数,就是不用定义函数名,lambda更像是一个表达式,限制了程序的嵌套,是一个为编写简单的函数而设计的。
dogfei
2020/07/31
9340
python的lambda函数
在Python中,lambda函数是一种匿名函数,也被称为"小型"或"即时"函数。与常规的函数不同,lambda函数没有名称,并且通常用于单行代码的简单功能。它们的语法如下:
叶茂林
2023/07/30
2450
set map list 之间的关联关系
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/17
4640
set map list 之间的关联关系
详细讲解:python中的lambda与sorted函数
python中的lambda函数可以接受任意数量的参数,但只能有一个表达式。也就是说,lambda表达式适用于表示内部仅包含1行表达式的函数。那么lambda表达式的优势就很明显了:
计算机与AI
2020/12/14
2.8K0
详细讲解:python中的lambda与sorted函数
java8之后的List与Map遍历(Lambda 表达式)
不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
向着百万年薪努力的小赵
2022/12/01
6740
【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
在 PySpark 中 RDD 对象 提供了一种 数据计算方法 RDD#map 方法 ;
韩曙亮
2023/10/11
7380
【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
学习LAMBDA函数:将Excel公式转换为自定义函数(下)
引言:本文学习整理自microsoft.com,LAMBDA的真正的解决了Excel公式存在的先天不足,让Excel公式真正的强大起来了。
fanjy
2023/02/16
2.5K0
学习LAMBDA函数:将Excel公式转换为自定义函数(下)
点击加载更多

相似问题

Ethereum闹钟还活着吗?

30

钱包格栅攻击还存在吗?

10

紫红色的纸还真的吗?

10

瓦斯用完了,还能还吗?

10

坚固的还绳不十六进制吗?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文