【问题标题】:F# under SharpDevelopSharpDevelop 下的 F#
【发布时间】:2010-07-01 01:19:13
【问题描述】:

好吧,这很令人沮丧,我已经安装了最新版本的 SharpDevelop,还安装了 F# 编译器(根据 SharpDevelops 网站的链接)

我在 Vista 中运行。

到目前为止,一切正常。

但由于某种原因,当我尝试使用 List.fold_left 时它只是拒绝编译,但是 List.fold 似乎可以工作,

这是错误:

未定义值、构造函数、命名空间或类型“fold_left”(FS0039)

代码如下:

#light
open System
let nums = [1..10]
let ans = List.fold_left (+) 0 nums
Console.WriteLine("answer: {0}", ans)
// Just to make it pause
let pause = Console.ReadLine()

进一步的问题是我正在尝试使用折叠来平方列表中的每个项目,例如:

1^2 + 2^2 + 3^2 ...

我假设 Fold 需要一个函数和一个列表,所以我尝试如下:

let sq x = x*x
let ans = List.fold (sq) 0 nums

但这在第二行都给了我以下错误:

类型'int -> int'与类型'int'不匹配(FS0001) - ''a -> int' 类型与 'int' 类型不匹配 (FS0001) -

请问有人能解释一下吗?

【问题讨论】:

    标签: list f# fold


    【解决方案1】:

    List.fold_left 是函数的旧名称,现在是 List.fold。您遇到的问题是 List.fold 有两个参数,第一个是折叠列表的函数,第二个是递归的初始种子。您使用的函数需要采用 两个 参数,即到目前为止的总和和列表的下一个元素。你想使用类似的东西

    List.fold (fun sum x -> sum + x * x) 0 [1..10]
    

    您得到的错误只是告诉您您尝试使用的函数类型没有采用正确数量的参数。

    【讨论】:

    • 所以这引起了我前几天想知道的事情。标准库中有正确的折叠吗?
    • @Nels - 是的,它叫做List.foldBack
    • 您可以通过查看我在答案中链接的文档来找到它。图书馆文档是一个不错的参考 - 看看!
    【解决方案2】:

    顺便说一下,图书馆参考文档在这里:

    http://msdn.microsoft.com/en-us/library/ee353567.aspx

    参见例如

    http://msdn.microsoft.com/en-us/library/ee353738.aspx

    (我已经忘记了在没有 Intellisense 的情况下开发是多么困难。)

    另外,您可以删除顶部的“#light”,它不是必需的。

    【讨论】:

    • 非常感谢您提供的链接,以及关于不需要#light 的提示。没有 Intellisense 很难,有一半的时间我不知道我的语法是否正确。
    • 不愿说出显而易见的事实,但请考虑改用 Visual Studio。你会在那里得到一些基本的智能感知
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多