gpt4 book ai didi

pattern-matching - 未解析的 flex 记录(需要知道此上下文中所有字段的名称)

转载 作者:行者123 更新时间:2023-12-04 19:12:28 27 4
gpt4 key购买 nike

我一直在尝试使用元组列表作为参数创建一个函数,但我不断收到错误消息:“未解析的 flex 记录(需要知道此上下文中所有字段的名称)”我的代码是:

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

这基本上是试图将一对列表转换为一对列表。我也尝试声明 d 的类型如 :('a * 'b) list但这导致了更多的错误。
我认为这与元组的未知大小有关,并且可以使用一些帮助来了解如何使其为人所知。

最佳答案

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

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)

(请注意,我还从 convert 的正文中删除了一些多余的括号,因为函数应用程序的优先级高于元组构造,而且我还删除了分号,这仅在对命令式代码进行排序或在 REPL 中输入代码)

This是标准机器学习的一个很好的风格指南,来自哈佛(或者塔夫茨大学)的类(class)。该文档的旧版本在“要避免的常见错误”下特别提到了这一点。

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

fun first (x, _) = x
fun second (_, y) = y

is preferred, and not

fun bogus_first p = #1 p (* WRONG *)
fun bogus_second p = #2 p

(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:

val (x, y) = lookup_pair mumble

But usually you can include matching in ordinary fun matching.

关于pattern-matching - 未解析的 flex 记录(需要知道此上下文中所有字段的名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com