ML версия анонимной карты внутри? - PullRequest
0 голосов
/ 14 декабря 2018

Я узнал в Scheme и Lisp, как сделать let, который заключает в себе map, который принимает анонимную (лямбда) функцию и список и возвращает список «или обработанный функцией» или ответ.Может кто-нибудь показать мне простую версию этого в SML?

Обновление:

Вот очень простая комбинация map и анонимной функции в схеме:

(map (lambda (x) (+ x 1)) ’(4 5 8))

который создает список

 ’(5 6 9)

Опять же, это очень распространено.

Вот функция Lisp, использующая все три:

(defun sequence1_v1 (vallist)
     (let ((a 4))
       (mapcar #'(lambda (val)
                   (/ (+ (* -3 val a) 10) (+ (* (expt val 2) (expt a 2)) 1)))
               vallist)
       ))

Математика - это просто последовательностьгенератор и значение a установлено в 4 означает 4-й элемент последовательности.Если мы спросим, ​​какое из следующих значений k будет a_4 положительным, -2, -1, 0, 1 или 2, мы получим

(sequence1_v1 '(-2 -1 0 1 2)) ->

(34/65 22/17 10 -2/17 -14/65)

Итак, первые три положительные.,,,Так что да, мир Lisp / Scheme много чего делает.Просто интересно, как это будет выглядеть в ML.

1 Ответ

0 голосов
/ 15 декабря 2018

Если ваша общая форма, которую вы хотите перевести, (на схеме)

(define (name ls)
     (let (<bindings>)
       (map <function> ls)))

, то в SML она выглядит почти так же, но с другой пунктуацией:

fun name ls = let <bindings> 
              in 
                  map <function> ls 
              end

Ианонимная функция (lambda (parameters) body) - это fn parameters => body.

(map (lambda (x) (+ x 1)) ’(4 5 8))

в SML:

map (fn x => x + 1) [4,5,8]

Ваш пример на Лиспе, переведенный:

fun sequence1_v1 ls = 
    let val a = 4
    in
        map (fn v => (-3 * v * a + 10) / ((pow(v, 2) * (pow(a,2)) + 1)) ls
    end 
...