gpt4 book ai didi

function - 发送中缀运算符作为参数时 F# 类型不匹配

转载 作者:行者123 更新时间:2023-12-03 06:29:25 25 4
gpt4 key购买 nike

我正在学习 F#,并且正在做一项练习,要求我对一堆 float 执行数学运算。

exception InterpreterError;;
type Instruction =
| ADD
| SUB
| MULT
| DIV
| SIN
| COS
| LOG
| EXP
| PUSH of float;;

type Stack = S of float list;;

let pop (S(s)) =
match s with
| [] -> raise InterpreterError
| x::_ -> (x,S(s));;

let push x (S(s)) : Stack = S(x::s)

let applyBin f s : Stack =
let (first, sGen1) = pop s
let (second,sGen2) = pop sGen1
push (f(first,second)) sGen2;;

let applyUni f s : Stack =
let (first, sGen1) = pop s
push (f(first)) sGen1;;

let intpInstr i s =
match i with
| ADD -> applyBin (+) s
| SUB -> applyBin (-) s
| MULT -> applyBin (*) s
| DIV -> applyBin (/) s
| SIN -> applyUni sin s
| COS -> applyUni cos s
| LOG -> applyUni log s
| EXP -> applyUni exp s
| PUSH(r) -> push r s;;

但是,我在尝试作为参数传递的中缀运算符(+、-、*、/)的最后一个函数 intpInstr 中遇到编译器错误:

Type mismatch. Expecting a
float * float -> float
but given a
float * float -> 'a -> 'b
The type 'float' does not match the type ''a -> 'b'

为什么运算符会变成 (+) : float -> float -> 'a -> 'b?我无法在交互式控制台中复制这种类型。感谢所有帮助。

最佳答案

根据您对 applyBin 的定义,参数 f 的类型为 (float * float) -> float,即它采用单个对参数,并且返回一个 float 。这是由于applyBin中的应用f(第一,第二)造成的。二元运算符 +-*/ 都有类型 float -> float -> float 因此看起来您打算将其设为 applyBin 中的 f 类型。您可以通过删除对结构来做到这一点:

let applyBin f s : Stack = 
let (first, sGen1) = pop s
let (second,sGen2) = pop sGen1
push (f first second) sGen2

关于function - 发送中缀运算符作为参数时 F# 类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42672795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com