При проверке модуля 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
Как правило, если вы хотите передать несколько библиотечных функций в качестве аргументов, вместо этого вы можете рассмотреть возможность создания модуля более высокого порядка (функтора), который принимает другой модуль в качестве аргумента.