Тип Проблема в SML - PullRequest
       16

Тип Проблема в SML

2 голосов
/ 25 декабря 2010

Я должен написать функцию, которая «раскладывает» список.

Пример: input [7, [[8]], [[5, [9]]], 6] -> output(1,7), (3,8), (3,5), (4,9), (1,6)

У меня есть функция, но я не могу ее использовать, потому что типпроблема.

Функция

datatype 'a superList = Elem of 'a
                    |   List of 'a superList list;


local
fun un_nested( [] , n ) = []
 | un_nested( (Elem x)::xs, n ) = (n, x) :: un_nested( xs, n )
 | un_nested( (List x)::xs, n ) = un_nested( x, n + 1) @ un_nested(xs, n)

in
fun flat list = un_nested(list, 1)  
end;

Пример

val test = List[List[Elem 2, List[Elem 3]]];
flat(test);

Ошибка

datatype 'a superList = Elem of 'a | List of 'a superList list
val flat = fn : 'a superList list -> (int * 'a) list
val test = List [List [Elem #,List #]] : int superList
superList.SML:16.1-16.11 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z superList list
  operand:         int superList
  in expression:
    flat test

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

Спасибо за помощь.

1 Ответ

5 голосов
/ 26 декабря 2010

Ваша функция принимает массив значений superList, но вы пытаетесь передать только одно значение.

Вот пример, который использует высокоуровневые функции List:

datatype 'a superList = Elem of 'a
                |   List of 'a superList list;

local
fun un_nested( Elem x , n ) = [(n, x)]
 | un_nested( List x, n ) = List.concat (List.map (fn e => un_nested(e, n + 1)) x)

in
fun flat list = un_nested(list, 1)  
end;

Если вы не хотите использовать высокоуровневые функции (я не знаю причин для этого), вы можете сделать это следующим образом:

datatype 'a superList = Elem of 'a
                    |   List of 'a superList list;

local
fun un_nested( Elem x , n ) = [(n, x)]
 | un_nested( List [], n ) = []
 | un_nested( List (x::xs), n ) = un_nested(x, n + 1) @ un_nested(List xs, n)

in
fun flat list = un_nested(list, 1)  
end;
...