metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-08 10:37 pm
Entry tags:

Эпический ад

Написал таки кусок кодогенератора на F#. Сначала в лоб, просто конверсией моих типов в последовательность строк SQL запроса для создания таблиц, а потом мне резко разонравилось отсутствие разделения модели и представления и я прикрутил AST для SQL, заодно заменив выходной результат на string seq, то бишь IEnumerable<string>.
Завтра буду прикручивать AST для дельфей, если мне не откозлопитонируют мозг какой-нибудь срочно-капец-нужно-вчера хреновиной.

Теперь понимаю, чего [livejournal.com profile] zabivator устроил хаскель-срач - когда над головой не висит чистота и ленивость, но есть discriminated unions, вывод типов и это дело корректно интегрировано в привычную среду, можно особо не задумываясь писать всякий мрак.

Но при этом однозначно начинать надо с хаскеля, а для F# - еще и дотнет знать, потому что иначе этот безумный бред понять затруднительно. Хаскель лаконичен, там те же самые идеи не заслоняются синтаксисом.

[identity profile] lionet.livejournal.com 2010-03-10 06:36 am (UTC)(link)
Это именно что "more precise than OCaml". То есть, хотят НЕ отлавливать лишний раз ветку case:
data T = A | B | C

f A = "a"
f x = case x of
	B -> "b"
	C -> "c"
А с этим окамл тем более не справляется:
[vlm@nala:~]> cat a.ml
type t = A | B | C

let f t = match t with
	| A -> "a"
	| x -> match x with
		| B -> "b"
		| C -> "c"
[vlm@nala:~]> ocamlopt a.ml
File "a.ml", line 5, characters 8-46:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
A
[vlm@nala:~]> 
На примитивном же уровне окамлового отлавливальщика хаскелевый работает с -Wall, нет никаких проблем:
a.hs:4:6:
    Warning: Pattern match(es) are non-exhaustive
             In a case alternative: Patterns not matched: A