SML более короткий синтаксис базового регистра для моей функции - PullRequest
0 голосов
/ 18 января 2019

Какой будет более короткий синтаксис для этой функции?Я заметил, что многие программисты используют каналы в своих функциях, но я застрял, пытаясь понять, как я могу сделать то же самое для этого.

fun test (i, x) = 
  if null x
then false
else
  if hd x = i then true
  else test(i, tl x)
//
val test = fn : ''a * ''a list -> bool

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вот более короткая версия:

fun test (_, []) = false
  | test (i, x::xs) = (x = i) orelse test (i, xs)

Вот что я сделал:

  1. Использовать сопоставление с образцом. В вашем втором решении вы уже сопоставляете шаблоны с пустым списком, так что это делает еще один шаг и сопоставляет шаблоны с непустым списком (x::xs), что делает использование hd и tl ненужным.

  2. Используйте шаблон _, когда вам не нужно значение.

  3. Вместо if P then true else Q напишите P orelse Q.

Скобка вокруг x = i не обязательна. Это выглядит немного запутанным с двумя различными = рядом друг с другом (один происходит из определения функции, а другой - двоичный оператор), но это также совершенно верно и означает то же самое:

fun test (_, []) = false
  | test (i, x::xs) = x = i orelse test (i, xs)

Или отступ удобнее:

fun test (_, []) = false
  | test (i, x::xs) =
      x = i orelse test (i, xs)
0 голосов
/ 18 января 2019

Так что я думаю, что нашел довольно хорошее решение.Каналы используются для определения конструкторов, первый - пустой случай, когда x - пустой список, а второй - для всех остальных.

fun test (i, []) = false
  | test (i,x)  = if hd x = i then true else test(i, tl x)
...