2013-06-13 2 views
0

У меня есть вопрос о списках отображения в ML проблема, кажется, повторяется, у меня есть текущие типы данных определены:списки отображая ML

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq); 
datatype 'a generic_list = List of 'a list 
          |Seq of 'a seq; 

я сейчас пытаюсь написать следующую функцию, которая предполагается Получать «'в generic_list» и возвращает "ИНТ generic_list:

val rec generic_map = fn (f,List(lst)) => if lst=nil then List([])            
     else List(f(List.hd(lst))::generic_map(f,List(List.drop(lst,1)))); 

Этот код не компилируется с ошибкой: правой рукой на стороне пункта не согласен с типом результата функции [tycon рассогласование ]:

'Z generic_list 
result type: 'Z list 
in declaration: 
    generic_map = 
    (fn (f,List lst) => 
      if lst = nil 
      then List nil 
      else List 
        (f (List.hd lst) :: 
        generic_map (f,List (List.drop (lst,1))))) 

Я хотел бы знать, Что здесь проблема и как я могу это исправить, так что будет компилировать, я не могу найти ошибку

+1

вопрос, почему он не компилируется, конечно, я не могу понять, где ошибка – yair

ответ

2

В «еще» части, вы something :: generic_map (...), что означает, что generic_map бы должны вернуть list вместо generic_list.

Кроме того, я не вижу, где вы обращаетесь с корпусом seq вообще.

В общем, я настоятельно рекомендую использовать сопоставление образцов вместо if, List.hd и друзей. В частности, сравнение, подобное lst = nil, всегда неверно, поскольку оно ограничивает список элементами с использованием типа равенства - используйте сопоставление шаблонов или, по крайней мере, предикат List.null.

Смежные вопросы