gpt4 book ai didi

function - 有没有办法让函数根据输入返回整数或字符串?

转载 作者:行者123 更新时间:2023-12-04 08:40:45 24 4
gpt4 key购买 nike

我得到了这个家庭作业(无法添加家庭作业标签)。这只是一个训练问题,不是上手的一部分。
我做了一个递归函数“eval”来评估整数(+、-、*、/)的常见操作
到目前为止,该函数可以计算加法、乘法和减法。

type expr =
| Const of int
| Add of expr * expr
| Mul of expr * expr
| Sub of expr * expr

let rec eval (n: expr): int =
match n with
| Const n -> n
| Add (a, b) -> eval a + eval b
| Mul (a, b) -> eval a * eval b
| Sub (a, b) -> eval a - eval b
此功能完美运行。接下来我必须扩展 expr 类型,以允许除法,添加:
| Div of expr * expr
我还需要通过创建一个新类型来处理零除法的情况:
('a, 'b) result
这是 eval 的新返回类型(这是在赋值描述中,所以我必须这样做)。
这是我的尝试:
type ('a, 'b) result =
| Ok of int
| Err of string

let rec eval (n: expr): ('a, 'b)result =
match n with
| Const n -> Ok(Const n)
| Add (a, b) -> Ok(eval a + eval b)
| Mul (a, b) -> OK(eval a * eval b)
| Sub (a, b) -> Ok(eval a - eval b)
| Div (_, Const 0) -> Err "zero division"
| Div (a, b) -> Ok(eval a / eval b)
但是我收到一个错误,说运算符 +、-、* 和/没有为类型 ('a, 'b) 结果定义,这是有道理的。所以我的问题是,有没有办法让新类型从其他类型继承?我无法输入以下内容:
type ('a, 'b) result =
| int
| Err of string
为什么那不是一回事?如果我在新类型中使用 int ,我是否必须指定一些关键字以便与 int 相关联? f# 想要相同的输出类型,不管输入是什么,有没有办法解决这个问题?如果我没有创建新类型,我可以告诉函数输出是整数还是字符串吗?

最佳答案

简短的回答是否定的。
就像你说的 F# 只允许一种返回类型。
在这种情况下,您的 result type 有 2 个可能的值集,Ok值和 Error值。
您的代码需要考虑两种可能性,您不能忽略其中一个。
记住 eval a不返回 int不再,现在它返回 result ,可能有也可能没有 int在里面。
在你之后 eval aeval b但在您调用之前+ , - , */ ,您需要检查任一结果是否为 Error .仅当两者都是 Ok然后你可以申请运营商吗?如果其中任何一个是 Error你必须返回错误,对吗?
您可以使用 match检查(并提取 int ),例如:

match eval  a , eval  b  with
| Ok a', Ok b' -> Ok(a' + b')
| Error e , _
| _ , Error e -> Error e
请记住,您不需要将上述说明复制 4 次。
您可以创建一个函数并将运算符作为参数传递
使用以下语法: (+) , (-) , (*) , (/) .
另一个提示:您只考虑除以 Const 0 的情况。 .
如果除以计算值 0 会发生什么,例如 5/(1 - 1) ?
在函数式编程中,还有另一种处理方法。
你最终需要的是一个 Bind函数(或 Apply)。
了解它的一个很好的资源是这个站点: https://fsharpforfunandprofit.com/rop/

关于function - 有没有办法让函数根据输入返回整数或字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64578253/

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