Шаблон-совпадение с пустым Fifo.fifo в SML / NJ - PullRequest
0 голосов
/ 25 апреля 2018

Когда я пытаюсь написать что-то вроде

fun test Fifo.empty = true
  | test _ = false`

Я получаю сообщение об ошибке Error: variable found where constructor is required: Fifo.empty. Я действительно новичок в SML / NJ. Оказывается, это как-то связано с Fifo.empty как longId, но я не выяснил, как это исправить, кроме как исправить его, передав Fifo.isEmpty в качестве аргумента, но это вряд ли решение ...

1 Ответ

0 голосов
/ 25 апреля 2018

При проверке модуля Fifo,

- open Fifo;
[autoloading]
[library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
[autoloading done]
opening Fifo
  datatype 'a fifo = ...
  exception Dequeue
  val empty : 'a fifo
  (* and so on *)

Вы можете видеть, что Fifo.empty - это значение 'fifo . Чтобы увидеть, как это сделано,

- Fifo.empty;
val it = Q {front=[],rear=[]} : 'a fifo

К сожалению, конструктор Q типа 'fifo скрыт модулем, являющимся непрозрачным (поэтому определение datatype выглядит как "...". Когда вы определить тип данных, его конструкторы (например, Q) становятся одновременно конструкторами значений и конструкторами шаблонов , но когда вы объявляете значения типа Fifo.empty с помощью таких конструкторов значений, они не также становятся конструкторами шаблонов.

Я не выяснил, как это исправить, кроме как залатать его, передав в качестве аргумента Fifo.isEmpty, но это вряд ли решение ...

Я не уверен, почему вам нужно было бы передать Fifo.isEmpty в качестве аргумента; Вы не можете просто сослаться на Fifo.isEmpty в теле функции? Возможно, есть аспекты этой проблемы, которые вы не объясняете.

Как насчет следующего:

fun test queue = Fifo.isEmpty queue

Или просто:

val test = Fifo.isEmpty

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

...