Найти, если Duplicates Exist SML NJ напротив

Что касается старого вопроса Найти, если Duplicates Exist SML NJ , если я хочу противоположный результат:

[1,2,2,3,4,5,6] should return false
[1,2,3,4,5,6,7] should return true
[1,2,3,4,5,6,1] should return false

как я могу его использовать:

fun duplicated [] = false
| duplicated (x::xs) = (List.exists (fn y => x = y) xs) orelse (duplicated xs)

Например,

fun non_duplicated ps =
case ps of
[] => false
| x::xs' => (List.exists (fn y => x<>y) xs') andalso (non_duplicated xs')

не работает.

Зачем??? Благодарю.

1
nl ja de
Предположим, ps - это строковый список
добавлено автор Rea, источник

1 ответы

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

fun non_duplicated xs = not (duplicated xs)

Тем не менее, вы можете нажать not внутрь тела функции duplicated , используя законы Де Моргана :

not (a orelse b) <=> (not a) andalso (not b)
not exists equal <=> forall (not equal)
not false <=> true

Затем вы достигаете противоположной версии:

fun non_duplicated [] = true
  | non_duplicated (x::xs) = 
      (List.forall (fn y => x <> y) xs) andalso (non_duplicated xs)
4
добавлено