【问题标题】:Standard ML and lookup tables with a find function具有查找功能的标准 ML 和查找表
【发布时间】:2012-11-14 16:56:35
【问题描述】:

使用折叠函数 SML 创建查找函数

我需要在标准 ML 中创建一个名为 lookup(k, table) 的函数,如果 k 不是查找表中的键,则返回 NONE,如果 (k,v) 在则返回 (SOME (k,v))桌子。例如lookup(3, [(1,4),(14,5),(7,3),(22,6]) 为NONE,而lookup (1,[(1,4),(14,5) ,(7,3,(22,6)]) 是 (SOME (1,4))。

我想使用这个查找功能:

fun find pred [] = NONE
  | find pred (x::rest) = if pred x then SOME x else find pred rest;

这是我目前所拥有的:

fun lookup(k,table) = NONE
 | lookup(k, find(k,table)) =
    if k = SOME then SOME else NONE;

请帮帮我,因为这个机器学习问题,我一直在拔头发。

【问题讨论】:

  • 那么什么不适合你?我首先要注意的是,您的语法有点偏离。包含find(k,table) 会使您看起来像是在尝试进行模式匹配。此外,函数find 已被柯里化,您正试图以元组形式使用它。也许您可以提炼出一些具体问题,并在收到具体错误消息时发布它们。

标签: lookup sml ml


【解决方案1】:

我相信您在这里将模式匹配与函数应用程序混淆了。在函数定义中,您可以进行模式匹配,即定义适用的情况,前提是函数的实际调用的参数与为参数指定的模式(由构造函数和变量组成)匹配。你不能做的是调用函数定义等号左侧的函数:... | lookup(k, find(k, table))find 的使用无效。

此代码将返回 table 中与 k 的键匹配的第一个键值对:

fun lookup(k,table) = 
  find (fn (key, value) => key = k) table

它使用函数find来遍历表格; find 将使用抽象 fn (key, value) => key = k 分解 table 中的每个键值对并检查键是否匹配 klookup 将返回 find 的结果,如果 (k, x)table,或者NONE,如果不是。

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多