【问题标题】:Using pattern matching to typecast in SML: fun f (typ : 'Z list option ) : 'Z list在 SML 中使用模式匹配进行类型转换: fun f (typ : 'Z list option ) : 'Z list
【发布时间】:2020-12-24 04:45:19
【问题描述】:

根据标题,尝试从以下函数返回一个字符串列表:

fun f (typ : 'Z list option ) : 'Z list =
    case typ of
        SOME x::xs' => x::xs' 

终端反馈如下:

hw2_1.sml:62.28-62.34 错误:运算符和操作数不一致 [循环性] 运算符域:'Z * 'Z 列表 操作数:'Z * 'Z 选项列表 表达: x :: xs'

hw2_1.sml:61.5-62.34 错误:案例对象和规则不一致 [tycon mismatch] 规则域:'Z 选项列表 object: 'Z 列表选项 表达: (案例类型 of :: (SOME x,xs') => x :: xs')

它告诉我操作符域和操作数不一致...这是否意味着 Z' 列表选项 不映射到 SOME x::xs' 就它所表示的类型而言?我显然没有以正确的方式思考这个问题......如果有任何提示,我将不胜感激。

【问题讨论】:

  • SOME x::xs' 中用括号括住x::xs'。因为SOME x::xs' 被 SML 解释为 (SOME x) :: xs' 这不是你想要的。

标签: types functional-programming pattern-matching sml smlnj


【解决方案1】:

您不需要显式注释类型。你也可以写:

fun f typ =
    case typ of
         NONE => ...
       | SOME (x::xs) => ...

或者你可以直接在函数中嵌入模式匹配:

fun f NONE = ...
  | f (SOME (x::xs)) = ...

正如 quoify 指出的那样,您遇到的问题与括号有关。

但我想指出,您可以通过隐式类型使您的程序更易于阅读。

无论如何他们都会是inferred

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多