Как я могу совместить случаи соединения динамически в F #, когда есть объявления о значениях?Проверка корпусов корпусов динамически
Non рабочего код:
let myShape = Shape.Square
expect myShape Shape.Circle
type Shape =
| Circle of int
| Square of int
| Rectangle of (int * int)
let expect someShape someUnionCase =
if not (someShape = someUnionCase)
then failwith (sprintf "Expected shape %A. Found shape %A" someShape someUnionCase)
let myShape = Shape.Square
expect myShape Shape.Circle // Here I want to compare the value types, not the values
Если мои дела профсоюзов не объявляло значение, это работает с использованием образцов Инстанцирования (что не то, что я хочу):
let myShape = Shape.Square
expect myShape Shape.Circle
type Shape =
| Circle
| Square
| Rectangle
let expect someShape someUnionCase =
if not (someShape = someUnionCase)
then failwith (sprintf "Expected shape %A. Found shape %A" someShape someUnionCase)
let myShape = Shape.Square
expect myShape Shape.Circle // Comparing values instead of types
Вау, это было уродливо. Я ожидаю ужасного удара производительности. Я использую его для проверки анализируемого дерева AST для ожидаемой используемой организации кода. –
Учитывая, что Джон Палмерс понимает, что все, что я хочу сделать, - это сравнить два целых числа, которые у меня есть, используя отражение или время генерации кода IL, кажется абсурдным. –
Все это относится к типам, которые не представлены значениями (объектами) в среде CLR , Это связано с тем, что Anders Heijsbergs Cool (позже C#) был смоделирован после Java. Который восходит к Гослингу, используя конструкторы вместо методов класса, не имея того факта, что Bjarne Strousup сделал бесцельный кошмар, потому что объект типа просто не соответствовал оригинальному инструменту перевода C++ в C.Такие вещи, как «конструкторы» и «статические» вместо функций-членов типа, были COMPROMISE из-за cfront. Позор Гослинга и Андерса за то, что они не понимают мотивацию беспринципного типа. –