【问题标题】:SML - Base case, wrong return value for declared datatypeSML - 基本情况,声明数据类型的返回值错误
【发布时间】:2013-07-09 21:35:52
【问题描述】:

我在编写函数的基本情况时遇到问题。我有一个我已经声明的数据类型。在基本情况下,我需要用一些东西替换 nil 。如何告诉它该函数不会返回任何内容?

datatype 'a newThing = Cons of 'a option * (unit -> 'a newThing);

fun permutation [] = Cons(NONE, fn () => nil)
|   permutation l = .....;


Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z option * (unit -> 'Z newThing)
operand:         'Z option * (unit -> 'Y list)
in expression:
Cons (NONE,(fn () => nil))

编辑:我不允许更改数据类型。

【问题讨论】:

    标签: pattern-matching sml smlnj type-mismatch


    【解决方案1】:

    您的数据类型只有 Cons 值构造函数(表示另一个元素),但您需要一个 Nil 构造函数(表示没有其他元素)。

    然后类型检查器会给你一个类型错误,因为你试图返回一个nil,它是'a list 类型,而不是'a newThing。

    您要做的是将Nil 构造函数添加到您的'a newThing 数据类型,并在基本情况下返回此值。

    datatype 'a newThing = Cons of 'a option * (unit -> 'a newThing)
                         | Nil
    
    fun permutation [] = Nil
      | permutation l = ...
    

    如果您不更改数据类型,则无法终止列表。它会一直持续下去,因为您唯一可以拥有的是一个 Cons,它代表另一个元素。

    假设您要表示的列表中没有NONE 元素,您可以让NONE 的值表示列表的结尾,并在元素用完后无限地返回NONE。

    fun permutation [] = Cons(NONE, permutation [])
    

    如果你愿意,你也可以抛出异常:

    exception EndOfNewThing
    
    fun permutation [] = raise EndOfNewThing
    

    但老实说,与添加新的值构造函数相比,这些解决方案相当糟糕。

    【讨论】:

    • 感谢您的回答,但我没有告诉您我不允许更改数据类型。我会将其添加到问题帖子中。
    • 我也不知道你能做到,所以至少我从你的帖子中学到了!
    • 我添加了一个异常来完成工作,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多