5

我正在寻找某种“面向初学者的机器学习”指南——到目前为止,谷歌已经引导我找到一些晦涩难懂的邮件列表或无法理解的文本。

问题是,到目前为止,我的函数式编程经验为零,并且围绕这些概念展开思考比预期的要困难得多。例如,我现在要做的任务(是的,大学:))是在两个列表(a,b)和(c,d)之间进行映射,因此结果是(a,d)的列表) 来自 b = c 的对。

我通常会做的是:

result = []
for each x in list1 do
  for each y in list2 do
    if x.b == y.c result.add (x.a, y.d)
  end
end

但是,我什至无法开始在 SML 中实现类似的东西。例如,我知道我可以用嵌套map f list的 's 遍历列表。但是,运行时 (SML/NJ) 只接受仅将列表元素作为参数的函数。但是,如果我一次只能对两个列表之一进行操作,我怎么知道要返回哪些元素呢?

我迫切需要一种可以解决这种事情的资源,最好是带有友好的大字母和大量代码示例:/

4

6 回答 6

8

CMU 的 Robert Harper 教授在标准 ML 中编程

于 2010-07-09T14:34:43.773 回答
5

我收藏了一些 SML 资源:

标准 ML '97 中的编程:在线教程
基本标准 ML (Amazon Kindle)
ML 编程元素(amazon.com)

于 2009-11-08T20:26:51.453 回答
2

对于您提到的练习,请考虑一个add返回新列表而不是修改现有列表的函数,并考虑如何以您最喜欢的高级语言递归地实现该练习,这将是第一步。

您不需要使用map或任何其他现有的高阶 ML 函数!这些只是有经验的程序员的捷径。仅使用模式匹配和递归。但是您可以查看函数的实现,例如,map如果您寻找使用良好的递归和模式匹配的示例。

于 2009-11-08T20:34:42.057 回答
2

递归多个单独的列表很麻烦(当然,这可能是本练习所需要的) - 通常从它们中创建一个列表更容易(“并排”,所以在你的情况下,每个条目都有一对整数),然后映射或折叠它。我怀疑 ML 将有一个名为“zip”之类的功能,它应该可以帮助您入门。

此外,目前并不是您真正想要的,但是如果您想要一本好的 ML 书(它实际上是 OCaml 的一种方言,但已经足够老,与 SML 没有那么大的不同),那么看看 Cousineau + Mauny。也许如果你在假期里有时间。这是一本非常好的书 - 有点像 SICP,但适用于 ML。

于 2009-11-08T21:09:05.393 回答
0

你了解柯里化是什么吗?

例如,您了解两者之间的区别吗?

fun compute(m,b,x):real = m*x+b ;

fun linearF (m,b) x : real = m*x+b ;

如果你这样做,你能解释一下是什么

val g = linearF(1.0,~1.0) ;

做?

柯里化对于解决您的问题并不是绝对必要的,但它是一种在函数式编程中大量使用的技术。特别是,它为您提供了一种根据需要使用 List.map 的方法。在这里,您想映射 list1,但您要使用的函数需要了解 list2 和计算结果。这表明您的代码可能具有以下形状

List.map (f [] list2) list1

其中 f 是一些适当定义的 Curried 函数。一般来说,这是一个有用的技巧,可以为函数提供更多信息,因为类似 List.map的原因,该函数需要成为“一个参数”函数。

这有帮助吗?

于 2010-09-19T01:08:49.913 回答
0

考虑下面的 map2 代码,这个函数与 map 完全一样,但有两个列表。

exception UnequalLengths;

fun map2(f,[],[]) = []
  | map2(f,(a::s),(a'::s')) = 
    (f(a,a'))::(map2(f,s,s'))
  | map2(f,s,s') = raise UnequalLengths;

fun plus(x,y) = x + y;
fun concat(s1,s2) = s1 ^ s2;

现在你像这样使用它:

- map2(plus,[1,2,3],[4,5,6]);
val it = [5,7,9] : int list
- map2(concat,["a","b","c"],["d","e","f"]);
val it = ["ad","be","cf"] : string list

享受XD

于 2012-02-11T13:38:21.553 回答