2016-08-11 5 views
2

Мне нужно создать функцию в ML, где аргументы представляют собой список и int, а функция принимает каждый элемент в списке и активирует его по указанному int. Так что я уже закодированы следующее:Использование заголовка списка как int в ML

(* power function (power x y => x^y) *) 
fun power x 0 = 1 
| power x 1 = x 
| power x y = x * (power x (y - 1)); 

и это основная функция:

fun powlist [] n = [] 
| powlist lst n = ((power hd(lst) n) :: (powlist tl(lst) n)); 

Это имеет смысл, я думаю, но компилятор (московская ML) показывает следующее: error message

ответ

0

Функция приложение имеет самую сильную связывающую силу, также hd(lst) действительно hd lst, следовательно, (power hd(lst) n) понимается компилятором как (power hd lst n), что означает функцию hd передается в качестве аргумента функции power вместо списка lst.

Один из способов изменить это, чтобы изменить некоторые скобки:

fun powlist [] n = [] 
    | powlist lst n = (power (hd lst) n) :: (powlist (tl lst) n) 

Но это не идиоматический код SML. Немного лучше было бы использовать шаблон-соответствия:

fun powlist []  n = [] 
    | powlist (h::tl) n = (power h n) :: (powlist tl n) 

И, вероятно, лучший подход должен был бы использовать стандартную List.map функцию, которая является более общим и реализуется, как tail-recursive в некоторых реализациях SML:

fun powlist lst n = List.map (fn x => power x n) lst 

Кстати, функция power можно записать немного более кратким:

fun power x 0 = 1 
    | power x y = x * (power x (y - 1)) 
+0

прекрасно работает. Большое спасибо! – athoslag

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

  • Нет связанных вопросов^_^