模式识别符不匹配

剃刀

F#的新手,想知道为什么在定义binaryMathFn时出现编译时错误。

我还将就更改此问题的标题提出建议。它不是最具描述性的:)

type Stack = StackContents of float list

let push item (StackContents stack) =
    match stack with
    | [] -> StackContents [item]
    | _ ->  StackContents (item::stack)

let pop (StackContents stack) =
    match stack with
    | [] -> failwith "Stack is empty, nothing to pop!"
    | h::t -> (h, StackContents t)    

let binaryMathFn fn (StackContents stack) = // Expression type is expected to be of type Stack?

    let item1, stack' = pop stack
    let item2, stack'' = pop stack'

    let result = fn item1 item2

    push result stack''
马克·西曼(Mark Seemann)

答案在于类型,但是在解释错误之前,这是使binaryMathFn函数编译的一种方法

let binaryMathFn fn stack =

    let item1, stack' = pop stack
    let item2, stack'' = pop stack'

    let result = fn item1 item2

    push result stack''

您对的定义Stack是歧视工会,其中一个工会案例称为StackContents当您将函数参数声明为时(StackContents stack),您使用的是表示以下内容的简写形式:

输入是类型Stack,但立即将该输入与单个StackContents并集大小写匹配,float list从输入中有效解包,然后将其分配float list给symbol stack

如果像我上面建议的那样,将参数声明更改为simple stack,则F#编译器可以自动推断出它stack是一个Stack值,因为该函数使用pop具有以下函数签名的函数:

Stack -> float * Stack

将其读取为以aStack作为输入并返回floatandStack作为输出的元组的函数由于binaryMathFn电话popstack,编译器可以推断stack必须是一个Stack值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章