【问题标题】:Map function on a list in Standard ML在标准 ML 中的列表上映射函数
【发布时间】:2018-08-17 08:41:56
【问题描述】:

基于这个定义:

追加列表是列表抽象数据类型的(简单)实现,它使构建成本低(O(1)),但销毁成本高(O(n))。 'a alistNN'a alist 类型定义如下:

datatype 'a alistNN = Sing of 'a | Append of 'a alistNN * 'a alistNN
datatype 'a alist = Nil | NonNil of 'a alistNN

'a alistNN 类型代表“非零”附加列表,而'a alist 类型代表任意(零或非零)附加列表。

我要求制作一个定义为的地图函数:

fun alistMap (f: 'a -> 'b) (xs: 'a alist): 'b alist =

在附加列表上执行映射。

我的定义如下:

fun alistMap (f: 'a -> 'b) (xs: 'a alist): 'b alist =
    case xs of
      Nil => Nil
    | NonNil xs => 
      let
        fun mapNN(f: 'a -> 'b) (xs: 'a alist): 'b alist =
           case xs of 
             Sing x => Sing (f x)
           | Append (ys, zs) => 
             let
               val ws = mapNN f ys
               val ts = mapNN f zs
             in
               alistAppend (ys , zs)
             end
      in
        mapNN f xs
      end

我不断遇到冲突的类型,尤其是:

Sing x => Sing (f x)

知道是什么原因造成的吗?

【问题讨论】:

    标签: sml ml mosml


    【解决方案1】:

    您的内部函数mapNN 使用错误类型进行了注释。构造函数SingAppend 形成alistNN 类型的值,而不是alist。所以应该改为如下注释。

    fun mapNN (f : 'a -> 'b) (xs : 'a alistNN) : 'b alistNN = ...
    

    您的代码还有其他几个问题:

    1. alistAppend (ys, zs) 行的类型为'a alist,但函数需要返回'b alistNN 类型的内容,所以这将是一个类型错误。作为解决此问题的提示,请注意您创建了值 wsts,但从不使用它们... ;)

    2. 修复mapNN后,mapNN f xs 行会出现类型错误,因为它的类型为'b alistNN,但必须是'b alist 类型。

    总之,注意alistalistNN之间的区别。这是两种不同的类型,具有不同的构造函数,具有根本不同的含义!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-05
      • 2016-01-19
      • 1970-01-01
      • 2012-04-09
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多