首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类型类&实例:模式参数是否成为列表?

类型类&实例:模式参数是否成为列表?
EN

Stack Overflow用户
提问于 2014-06-21 00:48:11
回答 1查看 71关注 0票数 3

Haskell这里的新手--我昨天遇到了这个问题,我就是没法把我的头绕过去。

最小工作实例

它可能不是很小,但它证明了我的问题--下面是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data VectorFeatureSet feature = VFS [feature]

class FeatureSet fs where
    getFeatures :: fs fl -> fl
instance FeatureSet VectorFeatureSet where
    getFeatures (VFS fl) = fl              -- <- error occurs here

(背景信息:)关于这些类型意味着什么的简短评论:Feature是一个具有形状和可选属性的地理实体。FeatureSet只是一组属于一起的Feature

编译器在此代码段的最后一行抛出的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Couldn't match expected type `fl' with actual type `[fl]'
  `fl' is a rigid type variable bound by
       the type signature for getFeatures :: VectorFeatureSet fl -> fl
       at (mentioned line)
In the expression: fl
In an equation for `getFeatures': getFeatures (VFS fl) = fl
In the instance declaration for `FeatureSet VectorFeatureSet'

如果我将函数定义更改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getFeatures (VFS [fl]) = fl

编译器接受它。

(附带说明:我知道,如果我使用命名字段表示法,Haskell可以为我创建选择器函数,但我目前正在学习Haskell,所以我是有意手工编写这些函数的。)

问题

现在,getFeatures函数应该只用于从FeatureSet中提取特性列表。我对模式的理解是,如果不需要访问/处理列表的内容,则不需要使用列表符号指定模式参数,只需从模式中获取列表并在函数中返回。

但是在这里,Haskell希望我使用像fs -> [fl] -> fl这样的函数定义来绑定像fs -> fl -> fl这样的签名(至少我是这么理解的)。

所以,这里我的问题是:为什么模式参数fl的类型在函数定义方程的左边和右边是不同的?

我觉得我在这里遗漏了一些基本的东西,但我想不出有什么最基本的东西要回去才能弄清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-21 01:13:52

给定VectorFeatureSet的定义,构造函数VFS具有[fl] -> VectorFeatureSet fl类型,即它“包含”的值将是fl的列表。

FeatureSet的实例中,getFeatures应该具有VectorFeatureSet fl -> fl类型。

因此,在编写getFeatures (VFS fl) = fl时,您将返回一个特性列表,而不是一个特性,因为变量fl有类型[fl] --注意类型和变量位于不同的名称空间中。

这就是类型错误告诉您的--函数应该返回一些类型为fl的内容,但实际上生成了某种类型的[fl]

当您编写getFeatures (VFS [fl]) = fl时,实际上是单个元素列表的模式匹配,所以如果您尝试使用VectorFeatureSet []VectorFeatureSet [x,y]等调用它,您的函数就会失败。

考虑到getFeatures的名称和您对它的描述,听起来应该将它定义为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FeatureSet fs where
    getFeatures :: fs fl -> [fl]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24339931

复制
相关文章
【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中的参数 , 返回 返回值类型 的返回值 ;
韩曙亮
2023/03/27
2.8K0
IDEA设置方法参数列表类型自动提示
默认情况下,IDEA的提示不够完全,可以通过以下设置,将提示功能打开的更完善. 效果如下面俩图所示 可以看到括号内的   l:  设置方法 File-Settings打开设置(或者ctrl +Alt+
noteless
2019/09/06
2.6K0
IDEA设置方法参数列表类型自动提示
day05(数字类型,字符串类型,列表类
 num = -1000000000000000000000000000000000000000000000000   print(num, type(num))                #<class 'int'>
py3study
2020/01/16
4800
【Python】列表判断是否存在使用方法和代码实例
判断在实际生活中的应用举例:比如注册一个邮箱账号,邮箱账号是不是不允许重复的,那么就可以把这个注册的新的邮箱账号做一个判断,如果在原有的邮箱账号了列表里就不可以注册了,告诉用户账号重复了,如果不在就可以注册。
python自学网
2022/03/31
7460
【Python】列表判断是否存在使用方法和代码实例
列表类型
序列是python中最基本的数据结构.序列中的每个元素都分配一个数字(它的位置或索引),第一个索引是0,第二个索引是1,一次类推.
py3study
2020/01/20
4840
设计模式——把类作为参数的抽象工厂模式
这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑。主要的用途一般是将一些复杂的类的创建过程整合在一起,通过参数控制,这样使用者可以较简单地获得实例。
TechFlow-承志
2020/12/18
1.2K0
Postgresql中的变长参数类型VARIADIC实例与限制
Postgresql支持变长参数传递,参数被自动转换为数据传入函数体中,类似C语言的可变参数:int sum(int num_args, ...)。
mingjie
2022/09/30
1.3K0
【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
使用 class 关键字 , 定义 Dart 类 , 所有的 Dart 类默认继承 Object 类 , 其中定义两个变量 , 定义一个标准的构造方法 , 构造方法中使用 this.name 表示自有参数 ;
韩曙亮
2023/03/28
2K0
python列表类型
例如下面的几个列表中,有存储数值的、字符串的、内嵌列表的。不仅如此,还可以存储其他任意类型。
py3study
2020/01/20
1.2K0
Python 列表是否线程安全?
Python中的列表不是线程安全的,在多线程环境下,对列表的操作可能会导致数据冲突或错误。但是,并非所有列表操作都是线程不安全的。如果操作是原子的,也就是说不能被线程调度机制打断,那么就没有问题。比如L.append(x)和L.pop()就是原子操作,所以是thread安全。如果操作不是原子的,或者涉及修改多个列表元素,那么就需要使用锁或者其他同步机制来保证线程安全。例如,Li = Lj 和 L.append(L- 1) 不是原子操作,因此它们可能会导致冲突。可以使用 dis 模块来检查操作是否是原子操作。
jackcode
2023/05/29
3850
Python 列表是否线程安全?
JVM 参数列表
这一篇说一下JVM 参数相关,首先JVM参数中包含着么几类 标准参数(Standard)、非标准参数(Non-Standard)、高级运行时选项、JIT相关编译高级选项、适用性高级选项、GC相关高级参数、不建议使用的参数(可能会被弃用) 后续会对每个系列的参数还有使用技巧进行详细的剖析,这一篇仅仅是个引导。 但是这个系列,对于不感兴趣的同学可能会无聊至极。不过掌握一些技巧还是蛮有趣的。 懂原理,才能更好的使用嘛~ 其中 标准参数:开头直接为参数名、 非标准参数: -X 开头 高级选项:-XX:
邹志全
2020/02/25
7220
可变参数列表
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112751.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
4100
报表开发-列表参数
(写sql也行的,js是吧数据拉出来操作,sql是在服务器端操作,建议不要勾选SQL表达式)
全栈程序员站长
2022/07/22
5370
报表开发-列表参数
解析类型参数
这个方法有效的原因是:向容量为零的切片追加元素将分配一个新的底层数组。函数体的长度最终比函数签名的长度要短,函数体短是一方面原因,函数签名长是另一方面原因。在本博客文章中,我们将解释为什么函数签名被写成这样。
孟斯特
2023/10/04
1520
解析类型参数
JVM参数类型
1. 标准参数 * -help * -server , -client * -version . -showversion * -cp , -classpath
用户1212940
2022/04/13
5880
JVM参数类型
解析类型参数
这个方法有效的原因是:向容量为零的切片追加元素将分配一个新的底层数组。函数体的长度最终比函数签名的长度要短,函数体短是一方面原因,函数签名长是另一方面原因。在本博客文章中,我们将解释为什么函数签名被写成这样。
孟斯特
2023/10/19
1640
解析类型参数
.NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
2018-09-01 08:28
walterlv
2018/09/18
4.3K0
点击加载更多

相似问题

如果类型参数的顺序错误,是否可以使类型成为类的实例?

40

使约束函数成为类型类实例

211

类型类实例列表

10

使函数成为向量类型类的实例

20

多参数类型类实例声明

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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