如何在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
,该类型都可以相同