131 \begin{isamarkuptext}% |
131 \begin{isamarkuptext}% |
132 \noindent resulting in the following code:% |
132 \noindent resulting in the following code:% |
133 \end{isamarkuptext}% |
133 \end{isamarkuptext}% |
134 \isamarkuptrue% |
134 \isamarkuptrue% |
135 % |
135 % |
136 \isadelimquote |
136 \isadelimtypewriter |
137 % |
137 % |
138 \endisadelimquote |
138 \endisadelimtypewriter |
139 % |
139 % |
140 \isatagquote |
140 \isatagtypewriter |
141 % |
141 % |
142 \begin{isamarkuptext}% |
142 \begin{isamarkuptext}% |
143 \begin{typewriter} |
143 structure\ Example\ {\isacharcolon}\ sig\isanewline |
144 structure\ Example\ {\isacharcolon}\ sig\isanewline |
|
145 \ \ val\ id\ {\isacharcolon}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\isanewline |
144 \ \ val\ id\ {\isacharcolon}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\isanewline |
146 \ \ val\ fold\ {\isacharcolon}\ {\isacharparenleft}{\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\ {\isacharminus}{\isachargreater}\ {\isacharprime}b{\isacharparenright}\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ list\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\isanewline |
145 \ \ val\ fold\ {\isacharcolon}\ {\isacharparenleft}{\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\ {\isacharminus}{\isachargreater}\ {\isacharprime}b{\isacharparenright}\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ list\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\ {\isacharminus}{\isachargreater}\ {\isacharprime}b\isanewline |
147 \ \ val\ rev\ {\isacharcolon}\ {\isacharprime}a\ list\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ list\isanewline |
146 \ \ val\ rev\ {\isacharcolon}\ {\isacharprime}a\ list\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ list\isanewline |
148 \ \ datatype\ {\isacharprime}a\ queue\ {\isacharequal}\ AQueue\ of\ {\isacharprime}a\ list\ {\isacharasterisk}\ {\isacharprime}a\ list\isanewline |
147 \ \ datatype\ {\isacharprime}a\ queue\ {\isacharequal}\ AQueue\ of\ {\isacharprime}a\ list\ {\isacharasterisk}\ {\isacharprime}a\ list\isanewline |
149 \ \ val\ empty\ {\isacharcolon}\ {\isacharprime}a\ queue\isanewline |
148 \ \ val\ empty\ {\isacharcolon}\ {\isacharprime}a\ queue\isanewline |
171 \ \ \ \ \ \ {\isacharparenleft}SOME\ y{\isacharcomma}\ AQueue\ {\isacharparenleft}{\isacharbrackleft}{\isacharbrackright}{\isacharcomma}\ ys{\isacharparenright}{\isacharparenright}\isanewline |
170 \ \ \ \ \ \ {\isacharparenleft}SOME\ y{\isacharcomma}\ AQueue\ {\isacharparenleft}{\isacharbrackleft}{\isacharbrackright}{\isacharcomma}\ ys{\isacharparenright}{\isacharparenright}\isanewline |
172 \ \ \ \ end{\isacharsemicolon}\isanewline |
171 \ \ \ \ end{\isacharsemicolon}\isanewline |
173 \isanewline |
172 \isanewline |
174 fun\ enqueue\ x\ {\isacharparenleft}AQueue\ {\isacharparenleft}xs{\isacharcomma}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ xs{\isacharcomma}\ ys{\isacharparenright}{\isacharsemicolon}\isanewline |
173 fun\ enqueue\ x\ {\isacharparenleft}AQueue\ {\isacharparenleft}xs{\isacharcomma}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ xs{\isacharcomma}\ ys{\isacharparenright}{\isacharsemicolon}\isanewline |
175 \isanewline |
174 \isanewline |
176 end{\isacharsemicolon}\ {\isacharparenleft}{\isacharasterisk}struct\ Example{\isacharasterisk}{\isacharparenright}\isanewline |
175 end{\isacharsemicolon}\ {\isacharparenleft}{\isacharasterisk}struct\ Example{\isacharasterisk}{\isacharparenright}\isanewline% |
177 |
176 \end{isamarkuptext}% |
178 \end{typewriter}% |
177 \isamarkuptrue% |
179 \end{isamarkuptext}% |
178 % |
180 \isamarkuptrue% |
179 \endisatagtypewriter |
181 % |
180 {\isafoldtypewriter}% |
182 \endisatagquote |
181 % |
183 {\isafoldquote}% |
182 \isadelimtypewriter |
184 % |
183 % |
185 \isadelimquote |
184 \endisadelimtypewriter |
186 % |
|
187 \endisadelimquote |
|
188 % |
185 % |
189 \begin{isamarkuptext}% |
186 \begin{isamarkuptext}% |
190 \noindent The \indexdef{}{command}{export\_code}\hypertarget{command.export-code}{\hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}}} command takes a |
187 \noindent The \indexdef{}{command}{export\_code}\hypertarget{command.export-code}{\hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}}} command takes a |
191 space-separated list of constants for which code shall be generated; |
188 space-separated list of constants for which code shall be generated; |
192 anything else needed for those is added implicitly. Then follows a |
189 anything else needed for those is added implicitly. Then follows a |
217 \begin{isamarkuptext}% |
214 \begin{isamarkuptext}% |
218 \noindent This is the corresponding code:% |
215 \noindent This is the corresponding code:% |
219 \end{isamarkuptext}% |
216 \end{isamarkuptext}% |
220 \isamarkuptrue% |
217 \isamarkuptrue% |
221 % |
218 % |
222 \isadelimquote |
219 \isadelimtypewriter |
223 % |
220 % |
224 \endisadelimquote |
221 \endisadelimtypewriter |
225 % |
222 % |
226 \isatagquote |
223 \isatagtypewriter |
227 % |
224 % |
228 \begin{isamarkuptext}% |
225 \begin{isamarkuptext}% |
229 \begin{typewriter} |
226 module\ Example\ where\ {\isacharbraceleft}\isanewline |
230 module\ Example\ where\ {\isacharbraceleft}\isanewline |
|
231 \isanewline |
227 \isanewline |
232 data\ Queue\ a\ {\isacharequal}\ AQueue\ {\isacharbrackleft}a{\isacharbrackright}\ {\isacharbrackleft}a{\isacharbrackright}{\isacharsemicolon}\isanewline |
228 data\ Queue\ a\ {\isacharequal}\ AQueue\ {\isacharbrackleft}a{\isacharbrackright}\ {\isacharbrackleft}a{\isacharbrackright}{\isacharsemicolon}\isanewline |
233 \isanewline |
229 \isanewline |
234 empty\ {\isacharcolon}{\isacharcolon}\ forall\ a{\isachardot}\ Queue\ a{\isacharsemicolon}\isanewline |
230 empty\ {\isacharcolon}{\isacharcolon}\ forall\ a{\isachardot}\ Queue\ a{\isacharsemicolon}\isanewline |
235 empty\ {\isacharequal}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\isanewline |
231 empty\ {\isacharequal}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\isanewline |
243 \ \ {\isacharbraceright}\ in\ {\isacharparenleft}Just\ y{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharsemicolon}\isanewline |
239 \ \ {\isacharbraceright}\ in\ {\isacharparenleft}Just\ y{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharsemicolon}\isanewline |
244 \isanewline |
240 \isanewline |
245 enqueue\ {\isacharcolon}{\isacharcolon}\ forall\ a{\isachardot}\ a\ {\isacharminus}{\isachargreater}\ Queue\ a\ {\isacharminus}{\isachargreater}\ Queue\ a{\isacharsemicolon}\isanewline |
241 enqueue\ {\isacharcolon}{\isacharcolon}\ forall\ a{\isachardot}\ a\ {\isacharminus}{\isachargreater}\ Queue\ a\ {\isacharminus}{\isachargreater}\ Queue\ a{\isacharsemicolon}\isanewline |
246 enqueue\ x\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharcolon}\ xs{\isacharparenright}\ ys{\isacharsemicolon}\isanewline |
242 enqueue\ x\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharcolon}\ xs{\isacharparenright}\ ys{\isacharsemicolon}\isanewline |
247 \isanewline |
243 \isanewline |
248 {\isacharbraceright}\isanewline |
244 {\isacharbraceright}\isanewline% |
249 |
245 \end{isamarkuptext}% |
250 \end{typewriter}% |
246 \isamarkuptrue% |
251 \end{isamarkuptext}% |
247 % |
252 \isamarkuptrue% |
248 \endisatagtypewriter |
253 % |
249 {\isafoldtypewriter}% |
254 \endisatagquote |
250 % |
255 {\isafoldquote}% |
251 \isadelimtypewriter |
256 % |
252 % |
257 \isadelimquote |
253 \endisadelimtypewriter |
258 % |
|
259 \endisadelimquote |
|
260 % |
254 % |
261 \begin{isamarkuptext}% |
255 \begin{isamarkuptext}% |
262 \noindent For more details about \hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}} see |
256 \noindent For more details about \hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}} see |
263 \secref{sec:further}.% |
257 \secref{sec:further}.% |
264 \end{isamarkuptext}% |
258 \end{isamarkuptext}% |
386 \noindent The corresponding code in Haskell uses that language's |
380 \noindent The corresponding code in Haskell uses that language's |
387 native classes:% |
381 native classes:% |
388 \end{isamarkuptext}% |
382 \end{isamarkuptext}% |
389 \isamarkuptrue% |
383 \isamarkuptrue% |
390 % |
384 % |
391 \isadelimquote |
385 \isadelimtypewriter |
392 % |
386 % |
393 \endisadelimquote |
387 \endisadelimtypewriter |
394 % |
388 % |
395 \isatagquote |
389 \isatagtypewriter |
396 % |
390 % |
397 \begin{isamarkuptext}% |
391 \begin{isamarkuptext}% |
398 \begin{typewriter} |
392 module\ Example\ where\ {\isacharbraceleft}\isanewline |
399 module\ Example\ where\ {\isacharbraceleft}\isanewline |
|
400 \isanewline |
393 \isanewline |
401 data\ Nat\ {\isacharequal}\ Zero{\isacharunderscore}nat\ {\isacharbar}\ Suc\ Nat{\isacharsemicolon}\isanewline |
394 data\ Nat\ {\isacharequal}\ Zero{\isacharunderscore}nat\ {\isacharbar}\ Suc\ Nat{\isacharsemicolon}\isanewline |
402 \isanewline |
395 \isanewline |
403 plus{\isacharunderscore}nat\ {\isacharcolon}{\isacharcolon}\ Nat\ {\isacharminus}{\isachargreater}\ Nat\ {\isacharminus}{\isachargreater}\ Nat{\isacharsemicolon}\isanewline |
396 plus{\isacharunderscore}nat\ {\isacharcolon}{\isacharcolon}\ Nat\ {\isacharminus}{\isachargreater}\ Nat\ {\isacharminus}{\isachargreater}\ Nat{\isacharsemicolon}\isanewline |
404 plus{\isacharunderscore}nat\ {\isacharparenleft}Suc\ m{\isacharparenright}\ n\ {\isacharequal}\ plus{\isacharunderscore}nat\ m\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharsemicolon}\isanewline |
397 plus{\isacharunderscore}nat\ {\isacharparenleft}Suc\ m{\isacharparenright}\ n\ {\isacharequal}\ plus{\isacharunderscore}nat\ m\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharsemicolon}\isanewline |
432 {\isacharbraceright}{\isacharsemicolon}\isanewline |
425 {\isacharbraceright}{\isacharsemicolon}\isanewline |
433 \isanewline |
426 \isanewline |
434 bexp\ {\isacharcolon}{\isacharcolon}\ Nat\ {\isacharminus}{\isachargreater}\ Nat{\isacharsemicolon}\isanewline |
427 bexp\ {\isacharcolon}{\isacharcolon}\ Nat\ {\isacharminus}{\isachargreater}\ Nat{\isacharsemicolon}\isanewline |
435 bexp\ n\ {\isacharequal}\ pow\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ Zero{\isacharunderscore}nat{\isacharparenright}{\isacharparenright}{\isacharsemicolon}\isanewline |
428 bexp\ n\ {\isacharequal}\ pow\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ Zero{\isacharunderscore}nat{\isacharparenright}{\isacharparenright}{\isacharsemicolon}\isanewline |
436 \isanewline |
429 \isanewline |
437 {\isacharbraceright}\isanewline |
430 {\isacharbraceright}\isanewline% |
438 |
431 \end{isamarkuptext}% |
439 \end{typewriter}% |
432 \isamarkuptrue% |
440 \end{isamarkuptext}% |
433 % |
441 \isamarkuptrue% |
434 \endisatagtypewriter |
442 % |
435 {\isafoldtypewriter}% |
443 \endisatagquote |
436 % |
444 {\isafoldquote}% |
437 \isadelimtypewriter |
445 % |
438 % |
446 \isadelimquote |
439 \endisadelimtypewriter |
447 % |
|
448 \endisadelimquote |
|
449 % |
440 % |
450 \begin{isamarkuptext}% |
441 \begin{isamarkuptext}% |
451 \noindent This is a convenient place to show how explicit dictionary |
442 \noindent This is a convenient place to show how explicit dictionary |
452 construction manifests in generated code -- the same example in |
443 construction manifests in generated code -- the same example in |
453 \isa{SML}:% |
444 \isa{SML}:% |
454 \end{isamarkuptext}% |
445 \end{isamarkuptext}% |
455 \isamarkuptrue% |
446 \isamarkuptrue% |
456 % |
447 % |
457 \isadelimquote |
448 \isadelimtypewriter |
458 % |
449 % |
459 \endisadelimquote |
450 \endisadelimtypewriter |
460 % |
451 % |
461 \isatagquote |
452 \isatagtypewriter |
462 % |
453 % |
463 \begin{isamarkuptext}% |
454 \begin{isamarkuptext}% |
464 \begin{typewriter} |
455 structure\ Example\ {\isacharcolon}\ sig\isanewline |
465 structure\ Example\ {\isacharcolon}\ sig\isanewline |
|
466 \ \ datatype\ nat\ {\isacharequal}\ Zero{\isacharunderscore}nat\ {\isacharbar}\ Suc\ of\ nat\isanewline |
456 \ \ datatype\ nat\ {\isacharequal}\ Zero{\isacharunderscore}nat\ {\isacharbar}\ Suc\ of\ nat\isanewline |
467 \ \ val\ plus{\isacharunderscore}nat\ {\isacharcolon}\ nat\ {\isacharminus}{\isachargreater}\ nat\ {\isacharminus}{\isachargreater}\ nat\isanewline |
457 \ \ val\ plus{\isacharunderscore}nat\ {\isacharcolon}\ nat\ {\isacharminus}{\isachargreater}\ nat\ {\isacharminus}{\isachargreater}\ nat\isanewline |
468 \ \ type\ {\isacharprime}a\ semigroup\isanewline |
458 \ \ type\ {\isacharprime}a\ semigroup\isanewline |
469 \ \ val\ mult\ {\isacharcolon}\ {\isacharprime}a\ semigroup\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\isanewline |
459 \ \ val\ mult\ {\isacharcolon}\ {\isacharprime}a\ semigroup\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\ {\isacharminus}{\isachargreater}\ {\isacharprime}a\isanewline |
470 \ \ type\ {\isacharprime}a\ monoid\isanewline |
460 \ \ type\ {\isacharprime}a\ monoid\isanewline |
503 val\ monoid{\isacharunderscore}nat\ {\isacharequal}\ {\isacharbraceleft}semigroup{\isacharunderscore}monoid\ {\isacharequal}\ semigroup{\isacharunderscore}nat{\isacharcomma}\ neutral\ {\isacharequal}\ neutral{\isacharunderscore}nat{\isacharbraceright}\isanewline |
493 val\ monoid{\isacharunderscore}nat\ {\isacharequal}\ {\isacharbraceleft}semigroup{\isacharunderscore}monoid\ {\isacharequal}\ semigroup{\isacharunderscore}nat{\isacharcomma}\ neutral\ {\isacharequal}\ neutral{\isacharunderscore}nat{\isacharbraceright}\isanewline |
504 \ \ {\isacharcolon}\ nat\ monoid{\isacharsemicolon}\isanewline |
494 \ \ {\isacharcolon}\ nat\ monoid{\isacharsemicolon}\isanewline |
505 \isanewline |
495 \isanewline |
506 fun\ bexp\ n\ {\isacharequal}\ pow\ monoid{\isacharunderscore}nat\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ Zero{\isacharunderscore}nat{\isacharparenright}{\isacharparenright}{\isacharsemicolon}\isanewline |
496 fun\ bexp\ n\ {\isacharequal}\ pow\ monoid{\isacharunderscore}nat\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ Zero{\isacharunderscore}nat{\isacharparenright}{\isacharparenright}{\isacharsemicolon}\isanewline |
507 \isanewline |
497 \isanewline |
508 end{\isacharsemicolon}\ {\isacharparenleft}{\isacharasterisk}struct\ Example{\isacharasterisk}{\isacharparenright}\isanewline |
498 end{\isacharsemicolon}\ {\isacharparenleft}{\isacharasterisk}struct\ Example{\isacharasterisk}{\isacharparenright}\isanewline% |
509 |
499 \end{isamarkuptext}% |
510 \end{typewriter}% |
500 \isamarkuptrue% |
511 \end{isamarkuptext}% |
501 % |
512 \isamarkuptrue% |
502 \endisatagtypewriter |
513 % |
503 {\isafoldtypewriter}% |
514 \endisatagquote |
504 % |
515 {\isafoldquote}% |
505 \isadelimtypewriter |
516 % |
506 % |
517 \isadelimquote |
507 \endisadelimtypewriter |
518 % |
|
519 \endisadelimquote |
|
520 % |
508 % |
521 \begin{isamarkuptext}% |
509 \begin{isamarkuptext}% |
522 \noindent Note the parameters with trailing underscore (\verb|A_|), which are the dictionary parameters.% |
510 \noindent Note the parameters with trailing underscore (\verb|A_|), which are the dictionary parameters.% |
523 \end{isamarkuptext}% |
511 \end{isamarkuptext}% |
524 \isamarkuptrue% |
512 \isamarkuptrue% |