gpt4 book ai didi

functional-programming - SML/NJ - 模式匹配动态打字

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

是否可以使用动态类型的输入参数编写函数?
我尝试了模式匹配,但显然它不是这样工作的。

我希望做这样的事情:

fun firstStr (0,n:string) = n
| firstStr (b:string,n:string) = if b>n then n else b;

谢谢你。

最佳答案

StandardML 是一种严格的静态类型语言。因此,您不能拥有在第一种情况下接受 int 并在第二种情况下接受字符串的函数。你得到的错误是

this clause:        string * string -> 'Z
previous clauses: int * string -> 'Z
in declaration:
firstStr =
(fn (0,<pat> : string) => n
| (<pat> : string,<pat> : string) => if <exp> > <exp> then n else b)

如果你想让一个 case 是一个字符串,一个 case 是一个 int,你可以创建一个新类型,一个“ tagged union”(又名“有区别的联合”),它被设计为易于与模式一起使用匹配。它看起来像这样:
datatype Wrapper = Int    of int
| String of string
fun firstStr(Int 0, n:string) = n
| firstStr(String b, n:string) = if b>n then n else b

当然,您可能希望为这种 Wrapper 类型找到一些更合适的名称,这在您的程序上下文中是有意义的。另请注意 n 上的类型注释不是真的有必要;写起来会更地道
fun firstStr(Int 0,    n) = n
| firstStr(String b, n) = if b>n then n else b

此外,编译器会告诉您您没有发现一个案例:如果第一个参数是一个不等于零的整数怎么办?

最后,比较 b>n 不是很清楚你的意思,您想比较两个字符串的哪个方面?我看到当我在 SML 中比较两个字符串时,我看到了字典(又名字母)比较。那是你想要的吗?

关于functional-programming - SML/NJ - 模式匹配动态打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1805547/

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