Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters F#-为什么可以’;我不能在这段代码中使用管道操作符吗?_Parameters_F#_Pipeline - Fatal编程技术网

Parameters F#-为什么可以’;我不能在这段代码中使用管道操作符吗?

Parameters F#-为什么可以’;我不能在这段代码中使用管道操作符吗?,parameters,f#,pipeline,Parameters,F#,Pipeline,我可能在这里遗漏了一些非常基本的东西,但我不知道它是什么 我有一些非常基本的代码,如下所示: let myList = [1; 3; 5; 7; 5; 3; 9; 5; 2; 5; 3; 8] let fiveOrLess = myList |> List.choose (fun number -> match number with | number when number <= 5 -> Some number | _ -> None)

我可能在这里遗漏了一些非常基本的东西,但我不知道它是什么

我有一些非常基本的代码,如下所示:

let myList = [1; 3; 5; 7; 5; 3; 9; 5; 2; 5; 3; 8]
let fiveOrLess = myList |> List.choose (fun number ->
    match number with
    | number when number <= 5 -> Some number
    | _ -> None)
让myList=[1;3;5;7;5;3;9;5;2;5;3;8]
让fiveOrLess=myList>List.choose(有趣的数字->
匹配号码
|当数的时候数一些数
|(无)
…正如预期的那样,效果很好

但是,在下面的代码中,我将“myList”从管道中移到了“normal”参数,从编译器中得到了两条错误消息:

let myList = [1; 3; 5; 7; 5; 3; 9; 5; 2; 5; 3; 8]
let fiveOrLess = List.choose (fun number ->
    match number with
    | number when number <= 5 -> Some number
    | _ -> None) myList
让myList=[1;3;5;7;5;3;9;5;2;5;3;8]
让fiveOrLess=List.choose(有趣的数字->
匹配号码
|当数的时候数一些数
|>无)我的列表
错误FS3118值或函数定义不完整。如果它位于表达式中,则表达式体必须缩进到与“let”关键字相同的列中。[第二个“let”上出现此错误。]

绑定中出现错误FS0010意外标识符。在此点或其他标记处或之前应为不完整的结构化构造。[最后一个“myList”上出现此错误。]

下面这些错误消息对我来说很有意义,因为我所做的只是将参数“从一边移到另一边”

这里的文档:显示的代码的形式与我的第二个示例非常相似,但工作正常

谁能解释一下我犯了什么愚蠢的基本错误?
另外,可能更重要的是,有人能解释一下错误消息的含义以及我为什么会收到这些消息,无论是在一般情况下还是在这种情况下吗?

您面临的问题是缩进

尝试进一步缩进,如下所示:

let myList = [1; 3; 5; 7; 5; 3; 9; 5; 2; 5; 3; 8]
let fiveOrLess = List.choose (fun number ->
      match number with
      | number when number <= 5 -> Some number
      | _ -> None) myList
最后,除非这是一个简化的复制,否则在这种情况下,
filter
是您的功能:

let myList = [1; 3; 5; 7; 5; 3; 9; 5; 2; 5; 3; 8]
let fiveOrLess = List.filter (fun n -> n <= 5) myList
让myList=[1;3;5;7;5;3;9;5;2;5;3;8]

设fiveOrLess=List.filter这是一个相当微妙的格式化问题,但是在一个多行的lambda之后,在一个“代码”>“/Code >行”开始后,将一个参数放在同一行上是无效的。您的代码以几种不同的方式具有非标准格式,但是F-编译器是相当许可的,直到它的最后一部分。ser完全不了解情况,无法提供有用的错误

因此,这并不是说你的格式显然是“错误的”,而是一旦你养成了按照正常格式标准编写F#代码的习惯,你就不会有这个问题。下面是一些格式化函数的标准方法:

let fiveOrLess =
    List.choose
        (fun number ->
            match number with
            | number when number <= 5 -> Some number
            | _ -> None)
        myList

我们使用上面的管道,因此多行lambda是最后一个参数。

对不起,我的原始代码有默认的4-空格缩进,在粘贴/格式化到该站点时没有出现。我已更改了上述代码。4-空格缩进适用于第一个版本,但不适用于第二个版本,5-空格缩进适用于第一个版本,但不适用于第二个版本第二个,但6个空格的缩进可以同时使用。此外,所有缩进行上的4个空格缩进也可以使用,除了最后一个有6个空格缩进的行。请参阅下一个注释…我已经阅读了,但仍然看不出我做错了什么。将“fiveOrLess”重命名为“fiveOrLe”修复了一些问题,但我不明白为什么。是否有某种模式我看不到?请注意,感谢“函数”提示,我还需要尝试了解“选择”与“过滤”有何不同(我只是遵循了Microsoft docs的示例)。@GarryP,您面临的问题是由于“缩进松弛”。官方规则是与
fun
|>
(或任何操作员)保持一致,但最近,有几个规则被放宽了。运算符在下一行引入了一个较小的负缩进,这有助于文本对齐,而不是运算符。此规则有点模糊,在您的示例中,此规则与
fun
上的另一个放宽规则相结合,后者通常引入一个新的“缩进范围”。我认为您的案例是一个bug,尽管是一个小bug,因为文档页面显示它应该可以工作。您可以将其添加到issue#470中。谢谢@Abel。似乎我要了解的基本内容(如格式)比我预期的要多得多。我不认为我愿意在Github ju中添加有关issue#470的对话还没有。聊天对我这个初学者来说变得越来越复杂,我不想让人觉得我只是把东西扔到桌子上然后就跑掉了。也许等我有了更多的经验,可以处理一些回复的时候。啊,我明白了。这样的格式会让它看起来更清晰。谢谢。这是我用这种方式格式化的唯一原因我这样做是因为微软文档中的格式就是这样的(请参阅我上面给出的链接)还有我试图学习的那本书。在我给出的链接中,Microsoft文档在多行lambda之后的同一行上有一个论点。该文档的格式是否不正确?如果是,这将使学习变得更加困难。还有,有没有办法让编译器更加不受限制,这样我就可以看到mo您之前是否有潜在的问题?@GarryP是的,我现在看到该实例中的文档不是很好。要更改编译器对空白的响应方式,您唯一能做的就是忽略特定的警告或将其视为错误。在这种情况下,这不会有帮助。我将研究重新格式化我编写的其他内容看看它是什么样子。希望我能习惯一些事情,用更好的方式去做会成为我的第二天性。再次感谢你的时间和建议。
let fiveOrLess =
    List.choose
        (fun number ->
            match number with
            | number when number <= 5 -> Some number
            | _ -> None)
        myList
let fiveOrLess =
    myList
    |> List.choose (fun number ->
        match number with
        | number when number <= 5 -> Some number
        | _ -> None)