【问题标题】:Getting started with Standard ML标准机器学习入门
【发布时间】:2010-12-14 10:38:16
【问题描述】:

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

问题是,到目前为止,我的函数式编程经验为零,而且围绕这些概念展开思考比预期的要困难得多。例如,我现在要做的任务(是的,大学:))是在两个列表(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 遍历列表。但是,运行时 (SML/NJ) 只接受仅将列表元素作为参数的函数。但是,如果我一次只能对两个列表之一进行操作,我怎么知道要返回哪些元素呢?

我迫切需要一种资源来处理这类事情,最好是大而友好的字母和大量代码示例:/

【问题讨论】:

    标签: functional-programming sml ml


    【解决方案1】:

    Programming in Standard ML CMU 的 Robert Harper 教授

    【讨论】:

      【解决方案2】:

      我收藏了一些 SML 资源:

      Programming in Standard ML '97: An On-line Tutorial
      Elementary Standard ML(亚马逊 Kindle)
      Elements of ML Programming(amazon.com)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            你了解柯里化是什么吗?

            比如,你明白两者的区别吗

            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 之类的原因需要成为“单参数”函数。

            这有帮助吗?

            【讨论】:

            • hmmm ... 反思使用 List.foldr 或 List.foldl 代替 List.map 更有可能导致一个简单的解决方案。
            【解决方案6】:

            考虑以下 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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-05
              • 1970-01-01
              • 2021-09-02
              • 2010-10-03
              • 1970-01-01
              • 1970-01-01
              • 2013-01-29
              • 2014-11-06
              相关资源
              最近更新 更多