【问题标题】:Empty tuple in smlsml 中的空元组
【发布时间】:2021-10-28 02:11:06
【问题描述】:

我正在编写一个应该返回 a list of 'a * 'a tuples 的函数。我实际上只将它用于整数。问题是,当我在模式匹配中编写基本案例时,我不知道如何编译:我尝试了类似

fun myf [] = []
fun myf [] = [()]
fun myf [] = [(NONE, NONE)]

没有,以上 3 个都完成了工作。 我在网上搜索什么也没找到。

【问题讨论】:

  • 第一个一个空列表,可以是'a * 'a list类型。第二个是unit 类型的列表,显然与您需要的类型不匹配。第三个是'a option * 'b option list 类型的值,同样,这与您需要的类型不匹配。
  • [] 提供给函数时的预期输出是什么?
  • 如果第一个不起作用,问题在于您如何将它与其余代码结合起来。请发帖minimal reproducible example
  • 您的问题是关于“返回”,但您正在尝试模式匹配,这通常会发生在您的函数的参数上。问题的整个结构具有误导性。您是否要对“对列表”类型的输入进行模式匹配,或者您希望输入中的值是什么类型?因为返回 ('int * int) 列表很简单,只需编写 [(1, 2)] 或任何元素为 (int * int) 类型的列表构造,也就是一对整数。
  • 例如:fun myf x = if x = 0 then [] else [(1, 2)];或 fun myf x = if x = 0 then [] else (1, 2)::[];返回一个 ('a * 'a) 列表就这么容易.. :-) 除非,如果你能帮助我们,你期望用什么来代替 'x'(参数)?

标签: functional-programming sml smlnj


【解决方案1】:

最接近“空元组”的是单位值:()。但是单位值列表只能有不同的长度,而不是每个元素中的不同值。如果你想要或者一个空值,或者某个特定值,你可以使用'a option类型,例如:

fun maximum [] = NONE
  | maximum [x] = SOME x
  | maximum (x::y::xs) = let val z = Int.max (x, y) in maximum (z::xs) end

如果您想要'a option 值的列表,您可能需要考虑为什么您关心在不同位置收集多个NONE 值。有这方面的用例,但如果没有它们,您通常也会很高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多