जब मैं कुछ लिखने की कोशिश करता हूँ

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

मुझे एक त्रुटि संदेश मिलता है जो कहता है Error: variable found where constructor is required: Fifo.empty। मैं वास्तव में एसएमएल/एनजे के लिए नया हूँ। यह पता चलता है कि इसका Fifo.empty एक longId होने के साथ कुछ लेना-देना है, लेकिन मुझे यह पता नहीं चला कि इसे कैसे ठीक किया जाए, सिवाय Fifo.isEmpty को एक तर्क के रूप में पारित करके इसे पैच करके, लेकिन यह शायद ही कोई समाधान है ...

1
Gepapado 25 अप्रैल 2018, 07:27

1 उत्तर

सबसे बढ़िया उत्तर

जब आप फीफो मॉड्यूल का निरीक्षण करते हैं,

- 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 एक 'a fifo मान है। यह कैसे बनता है यह देखने के लिए,

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

दुर्भाग्य से 'a fifo का Q डेटाटाइप कंस्ट्रक्टर अपारदर्शी (इसलिए datatype परिभाषा "..." के रूप में प्रकट होती है। जब आप किसी डेटाटाइप को परिभाषित करते हैं, तो उसके निर्माता (जैसे Q ) वैल्यू कंस्ट्रक्टर और पैटर्न कंस्ट्रक्टर दोनों बन जाते हैं, लेकिन जब आप ऐसे वैल्यू कंस्ट्रक्टर्स का उपयोग करके Fifo.empty जैसे वैल्यू घोषित करते हैं, तो वे पैटर्न कंस्ट्रक्टर भी नहीं बनते हैं।

मुझे नहीं पता कि इसे कैसे ठीक किया जाए, सिवाय Fifo.isEmpty को तर्क के रूप में पारित करके इसे पैच करके, लेकिन यह शायद ही कोई समाधान है ...

मुझे यकीन नहीं है कि आपको तर्क के रूप में Fifo.isEmpty में पास होने की आवश्यकता क्यों होगी; क्या आप फंक्शन बॉडी में सिर्फ Fifo.isEmpty का उल्लेख नहीं कर सकते? शायद इस समस्या के आयाम हैं जिन्हें आप समझा नहीं रहे हैं।

निम्नलिखित के बारे में कैसे:

fun test queue = Fifo.isEmpty queue

या केवल:

val test = Fifo.isEmpty

आम तौर पर, यदि आप तर्क के रूप में पुस्तकालय कार्यों के एक समूह में गुजरने की तरह महसूस करते हैं, तो आप इसके बजाय एक उच्च-आदेश मॉड्यूल (फ़ंक्टर) बनाने पर विचार कर सकते हैं जो तर्क के रूप में एक और मॉड्यूल लेता है।

2
Simon Shine 25 अप्रैल 2018, 08:30