Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Syntax F#一级缩进的类型错误,而不是另一级缩进的类型错误_Syntax_F# - Fatal编程技术网

Syntax F#一级缩进的类型错误,而不是另一级缩进的类型错误

Syntax F#一级缩进的类型错误,而不是另一级缩进的类型错误,syntax,f#,Syntax,F#,我正在浏览文档,发现了一个奇怪的类型错误: let create x = Job.delay <| fun () -> let c = {reqCh = Ch (); replyCh = Ch ()} Job.iterateServer x <| fun x -> c.reqCh >>= function | Get -> c.replyCh *<- x >>-. x

我正在浏览文档,发现了一个奇怪的类型错误:

let create x = Job.delay <| fun () ->
    let c = {reqCh = Ch (); replyCh = Ch ()}
    Job.iterateServer x <| fun x ->
        c.reqCh >>= function
          | Get -> c.replyCh *<- x >>-. x
          | Put x -> Job.result x
    >>-. c

Scrapers.SC.fsx(48,10): error FS0001: Type mismatch. Expecting a
    ''a'    
but given a
    'Cell<'a>'    
The types ''a' and 'Cell<'a>' cannot be unified.
这两者之间的唯一区别是第一个缩进的深度——2,而不是4

通常,当缩进出现问题时,我会得到一个“可能不正确的缩进”警告——而不是类型错误。所以它一定很混乱

我已经使用F#十年了,但我仍然不理解缩进规则


我遗漏了什么?

运算符是4个字符,因此需要更多缩进才能使其不与上面的表达式连接。运营商的规则是为了制造像这样的东西

    expr
 |> f1
 |> f2

使用管道中表达式左侧的运算符进行操作。

除了“2个空格或4个空格”之外,我在代码中还看到了另一个缩进差异,那就是
c.reqCh
的缩进。在第一个示例中,
c.reqCh
iterateServer
对齐,而在第二个示例中,它不是。我自己并不完全理解缩进规则(因此我在前面的评论中链接到了),但我怀疑
c.reqCh
iterateServer
对齐的事实在某种程度上导致F#解析器误解了它是什么。(但我不知道怎么做)

如果您以第一个示例为例,在
c.reqCh
行和接下来的两行前面添加一个空格,会发生什么情况?换句话说,如果你把它改成这样

let create x = Job.delay <| fun () ->
    let c = {reqCh = Ch (); replyCh = Ch ()}
    Job.iterateServer x <| fun x ->
         c.reqCh >>= function
           | Get -> c.replyCh *<- x >>-. x
           | Put x -> Job.result x
    >>-. c

这是否也会使类型错误消失?如果是这样,那么我们还需要看一下
“我缺少什么?”的优先顺序,这是一个竖起大拇指的投票,这是一个修复当前混乱规则的建议。:-)@完成了,完成了,啊@布莱恩的解释似乎是正确的。缩进问题是由
>-.
操作符引起的,而不是
迭代服务器
。因此,我的最后一个示例(带括号)也应该可以使用,因为右括号与
>-.
在同一行,因此代码的哪一部分是
>-.
运算符的左操作数是明确的。顺便说一句,您可以在语言规范中了解这一点,它是“越位规则的例外情况”
let create x = Job.delay <| fun () ->
    let c = {reqCh = Ch (); replyCh = Ch ()}
    Job.iterateServer x <| fun x ->
         c.reqCh >>= function
           | Get -> c.replyCh *<- x >>-. x
           | Put x -> Job.result x
    >>-. c
let create x = Job.delay <| fun () ->
    let c = {reqCh = Ch (); replyCh = Ch ()}
    Job.iterateServer x (fun x ->
        c.reqCh >>= function
          | Get -> c.replyCh *<- x >>-. x
          | Put x -> Job.result x
    ) >>-. c