Хорошо, вопрос, я хотел бы использовать массив размеченных объединений в функциях массива. В приведенном ниже коде я определяю тип ResultVari
, который является либо Unknown
, либо значением с плавающей запятой. Я также определяю оператор infix plus для типа, который возвращает значение, только если оба аргумента не равны Unknown
. Это прекрасно работает.
type ResultVari =
| Unknown
| Value of float
static member (+) (a,b) = // add two ResultVari's together
match a,b with
| Value(av),Value(bv) -> Value(av + bv) // only has a value if both args do.
| _ -> Unknown
(* Summation of array of ResultVari, such that if any are unknown then the result is Unknown *)
let example1 = [| Value(4.0); Value(5.5); Value(3.1) |] // summation should be 12.6
let example2 = [| Value(4.0); Unknown; Value(3.1) |] // summation should be Unknown
let summation (varArray:ResultVari array) =
Array.sum (+) varArray //ERROR this value is not a function and cannot be applied
let summation2 (varArray:ResultVari array) =
Array.fold (+) (Value(0.0)) varArray // Works
let sum_example1 = summation2 example1
let sum_example2 = summation2 example2
printfn "%A" sum_example1 // 12.6
printfn "%A" sum_example2 // Unknown
При использовании summation2
программа работает, как и ожидалось, с суммой для example1
, равной 12,6, и для example2
, равной Unknown
.
Но я не понимаю, почему summation
не работает - компилятор ругается "это значение не является функцией и не может быть применено". В другой попытке (не показанной) я также получил ошибку отсутствующего элемента get_Zero, как я понимаю, функция суммирования должна использовать какой-то тип нулевого определения, чтобы начать суммирование, и использовать функцию fold с моим значением (0,0 ), так как начальное значение, как в summation2
, решает это.
Итак, есть ли способ определить элемент get_Zero для размеченного объединения, или вместо этого мне придется использовать тип записи для ResultVari? Тогда я мог бы использовать Array.sum вместо Array.fold.
option
только с этим типомResultVari
? - person Mark Seemann   schedule 01.05.2016None
? - person Mark Seemann   schedule 02.05.2016None
может использоваться для обозначения того, что переменная не установлена, но разве концепция None не означает, что элемент «отсутствует» или что-то вроде нуля? Хотя в этом параметре (возможно, неясном) он предназначен для представления переменной, которая может быть установлена или не установлена, например, в ходе исследования ветвей и границ или около того. Так что в этом случае мой выбор использования Unset был бы более подходящим, чем использование этого типа опции и использованиеNone
для обозначения того, что это значение еще не установлено (что, я согласен, может работать). - person user1857742   schedule 03.05.2016