Конфликт сопоставления с образцом - PullRequest
0 голосов
/ 17 апреля 2019

У меня проблема с сопоставлением с образцом в программе sml. Мой код такой:

fun ff (arr, _, [], _) = []
   |ff (arr, 0, (x::xs), ping_list) =ping_list
   |ff (arr, K, (x :: xs), ping_list) =
        (if Array.sub(arr, x)-1 < 1
        then ff(arr, (K-1), xs, (ping_list@[x]))
        else ff(arr, K, xs, (ping_list@[x])))

Как вы можете видеть после прохождения третьего случая сопоставления с образцом, возможно, что и K будет 0, а третий список аргументов будет []. В этом случае после выполнения некоторых тестов он выбирает первый шаблон и возвращает [].

Как я могу управлять этим? В случае, когда K = 0 и xs пустые, я хотел бы, чтобы выполнялся второй шаблон, и ping_list был результатом, но я также хотел бы понять, как обрабатываются угловые случаи, подобные этому по sml.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Если вам нужно то же определение для 0 и [], что и для 0 и x::xs, вы можете свернуть их в один случай для 0 и любого списка.

Но вам нужно сначала поставить это предложение, чтобы избежать совпадения с общим случаем пустого списка:

fun ff (_, 0, _, ping_list) = ping_list
  | ff (_, _, [], _) = []
  | ff (arr, K, x::xs, ping_list) =
        if Array.sub(arr, x)-1 < 1
        then ff(arr, K-1, xs, ping_list@[x])
        else ff(arr, K, xs, ping_list@[x])
0 голосов
/ 18 апреля 2019

У вас обычно самый общий случай в качестве последнего случая, а самый конкретный случай - в качестве верхнего.

Если вы хотите, чтобы K = 0 и xs = [] возвращали ping_list, ваш второй случай должен выглядеть следующим образом

|ff (_, 0, (x::[]), ping_list) = ping_list

вам не нужно называть arr, поскольку вы его не используете. И список должен быть x :: [], если вы хотите соответствовать xs = []

...