加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

模式匹配 – 未解析的flex记录(需要知道此上下文中所有字段的名

发布时间:2020-12-15 01:47:43 所属栏目:百科 来源:网络整理
导读:我一直在尝试使用元组列表作为参数创建一个函数,但我不断收到错误:“未解析的flex记录(需要知道此上下文中所有字段的名称)”我的代码是: fun convert d = ( (map (#1) d),(map (#2) d) ); 这是基本上尝试将对列表转换为一对列表.我还尝试将d的类型声明为:(
我一直在尝试使用元组列表作为参数创建一个函数,但我不断收到错误:“未解析的flex记录(需要知道此上下文中所有字段的名称)”我的代码是:

fun convert d = ( (map (#1) d),(map (#2) d) );

这是基本上尝试将对列表转换为一对列表.我还尝试将d的类型声明为:(‘a *’b)列表,但这导致更多错误.
我认为这与tupple的未知大小有关,可以使用一些帮助来了解它.

解决方法

我怀疑你在注释d类型时遇到的问题实际上就是你没有用parens包围注释,这对我有用:

fun convert (d : ('a * 'b) list) = ( (map (#1) d),(map (#2) d) )

但是,这并不是很好的SML风格.使用#1,#2,#n等等有点气馁,因为它会导致类似这样的问题,你失去了类型推断给你的一些常见的难度.

相反,您可以为对定义一些显式选择函数:

fun first  (a,_) = a
fun second (_,b) = b

fun convert d = (map first d,map second d)

(请注意,我还从转换体中删除了一些多余的括号,因为函数应用程序具有比元组构造更高的优先级,并且我还删除了在对命令式代码进行排序或键入代码时才真正需要的分号进入REPL)

This是标准ML的一个非常好的风格指南,来自哈佛大学(或者塔夫茨大学)的课程.该文档的旧版本在“要避免的常见错误”中明确提到了这一点.

Avoid #1 and #2

Some beginners pick up the idea that a good way to get the second element of a pair p is to write #2 p.

This style is not idiomatic or readable,and it can confuse the type checker. The proper way to handle pairs is by pattern matching,so

06002

is preferred,and not

06003

(For reasons I don’t want to discuss,these versions don’t even type-check.)

If your pair or tuple is not an argument to a function,use val to do the pattern matching:

06004

But usually you can include matching in ordinary fun matching.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读