сопоставление с образцом списка пустого списка - PullRequest
1 голос
/ 08 апреля 2019

Я делаю домашнее задание для университета и сталкиваюсь со странной проблемой с порталом webassign (вы вводите свой код, и тот проверяет, все ли в порядке).

Нам нужно написать функцию для умножения матриц. Это делается шаг за шагом с использованием векторного умножения, матричного мульт-вектора, матричного мульт-матрицы.

Мой код работает на интерпретаторе smlnj, но не в webassign:

fun v_v_mult [] _  = 0.0
  | v_v_mult _  [] = 0.0
  | v_v_mult (r::rs) (c::cs) = r*c + v_v_mult rs cs

fun m_v_mult [] _  = []
  | m_v_mult _  [] = []
  | m_v_mult (rv::rvs) cs = v_v_mult rv cs :: m_v_mult rvs cs

Итак, все хорошо в моем REPL, но webassign говорит мне, что

m_v_mult [[]] [] 

вызывает исключение. Я не могу воспроизвести исключение в моем REPL, так как приведенный выше код работает, как и ожидалось.

Нужно ли что-то особенное для шаблона, соответствующего списку пустого списка? Я искал stackoverflow, но не нашел подсказки. Можете ли вы дать мне подсказку (или ссылку или ключевое слово для лучшего поиска)?

Спасибо, Jochen

1 Ответ

0 голосов
/ 13 апреля 2019

ок, ребята, ответ несколько странный.

fun m_v_mult [] _  = []
  | m_v_mult (rv::rvs) cs = v_v_mult rv cs :: m_v_mult rvs cs

, то есть вторая строка удалена.

Это потому, что у m_v_mult [[]] [] нет пустой матрицы в первом аргументе, но есть матрица с одной строкой, которая является пустой. Таким образом, результатом должен быть вектор с одним элементом, который включает сумму по 0 числам. Таким образом, результатом должен быть идентификатор сложения, равный 0. И этот результат вы получите в последнем случае, который вызывает v_v_mult, который возвращает 0 для этого случая.

Я бы не пришел к этому решению без намека учителя.

Спасибо, что помогли подумать об этой проблеме и сказали, что я по крайней мере прав в том, как я ее кодировал.

...