如何在SML中使用foldr解析列表

如何在SML中使用foldr解析列表,sml,Sml,假设我有一个列表: type myList = (string * int) list; 我想用foldr找到这个列表中的一个特定元素,比如: fun findElement (element : string) (list : myList) : int result = if needed_element is equal current_list_element then return current_list_element else continue checking the r

假设我有一个列表:

type myList = (string * int) list;
我想用foldr找到这个列表中的一个特定元素,比如:

fun findElement (element : string) (list : myList) : int result =
 if needed_element is equal current_list_element then return current_list_element
 else continue checking the rest of the list
 else return -1

如何做到这一点?

编写伪代码非常有用

明确确定此功能的类型也很有帮助,例如:

val findElement = fn : string -> myList -> ?
函数应该返回什么类型?在伪代码中编写
int-result
,但是
result
在标准ML中不能作为内置类型构造函数使用。那么它应该是什么呢<代码>整数?如果没有匹配的元素,如何区分任何特定结果和“无结果”呢?你有什么选择


请尝试在不首先使用
foldr
的情况下解决此问题

由于扫描列表意味着沿着其结构递归,因此可以使用模式匹配编写此函数,将模式分为与空列表匹配的模式和与非空列表匹配的模式:

fun lookup needle [] = ?
  | lookup needle ((key, value) :: haystack) =
      if ?
      then ?
      else ?
  • 必须将
    与每对针进行比较,直到其中一个匹配。如何比较SML中的两个相等值
  • 当条件满足时,无需执行进一步的递归,因此可以返回一个值。如何在SML中返回某些内容
  • 当条件不满足时,搜索将继续进行
    lookup
    调用
    haystack
    。称自己是指在“
    else
    ”后面的正文中引用
    lookup
    。它究竟应该用什么样的参数来称呼自己

理解基本递归函数是理解foldr的先决条件。此时,请尝试阅读
foldr
。我找不到任何关于这方面的好的公开材料,所以我会查找你们提供的任何书型学习材料

就与使用
foldr
表达
查找相关的挑战而言:

  • foldr
    在找到元素时不会停止递归
  • 您可以通过抛出一个异常并捕获它来停止它。这有点棘手
  • 您可以让它循环到最后,并保留找到的第一个元素。这有点低效
模板可能如下所示:

fun lookup needle haystack =
    foldr (fn ((key, value), acc) => ?) ? haystack
或者您可以将匿名函数命名为
fn…=>本地:

fun lookup needle haystack =
    let fun go ((key, value), acc) = ?
    in foldr go ? haystack
    end
此处,
指的是
查找
返回的类型的值


无论您是使用手动递归还是
foldr

编写伪代码,该类型都可以是相同的

明确确定此功能的类型也很有帮助,例如:

val findElement = fn : string -> myList -> ?
函数应该返回什么类型?在伪代码中编写
int-result
,但是
result
在标准ML中不能作为内置类型构造函数使用。那么它应该是什么呢<代码>整数
?如果没有匹配的元素,如何区分任何特定结果和“无结果”呢?你有什么选择


请尝试在不首先使用
foldr
的情况下解决此问题

由于扫描列表意味着沿着其结构递归,因此可以使用模式匹配编写此函数,将模式分为与空列表匹配的模式和与非空列表匹配的模式:

fun lookup needle [] = ?
  | lookup needle ((key, value) :: haystack) =
      if ?
      then ?
      else ?
  • 必须将
    与每对针进行比较,直到其中一个匹配。如何比较SML中的两个相等值
  • 当条件满足时,无需执行进一步的递归,因此可以返回一个值。如何在SML中返回某些内容
  • 当条件不满足时,搜索将继续进行
    lookup
    调用
    haystack
    。称自己是指在“
    else
    ”后面的正文中引用
    lookup
    。它究竟应该用什么样的参数来称呼自己

理解基本递归函数是理解foldr的先决条件。此时,请尝试阅读
foldr
。我找不到任何关于这方面的好的公开材料,所以我会查找你们提供的任何书型学习材料

就与使用
foldr
表达
查找相关的挑战而言:

  • foldr
    在找到元素时不会停止递归
  • 您可以通过抛出一个异常并捕获它来停止它。这有点棘手
  • 您可以让它循环到最后,并保留找到的第一个元素。这有点低效
模板可能如下所示:

fun lookup needle haystack =
    foldr (fn ((key, value), acc) => ?) ? haystack
或者您可以将匿名函数命名为
fn…=>本地:

fun lookup needle haystack =
    let fun go ((key, value), acc) = ?
    in foldr go ? haystack
    end
此处,
指的是
查找
返回的类型的值

无论使用手动递归还是
foldr
,该类型都可以相同