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] gds.livejournal.com 2010-03-10 06:07 am (UTC)(link)
именно в комментариях прочитал:
But there was also some indications given that proper exhaustiveness checking in Haskell is undecidable.

Yes, they mean in the more precise sense (i.e. things that locally look partial, but are actually total because of invariants in other parts of the program).

[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