2013-10-25 6 views
2

В настоящее время у меня есть специальный тип, который может быть как int, так и float. Я хочу создать функцию, которая позволит мне добавить два из них вместе. (при необходимости принудительно привязав int к float) Я хочу, чтобы функция имела тип возврата моего специального типа.Создание функции «плюс» с пользовательским типом с использованием принуждения F #

Вот то, что я до сих пор:

type number = A of int | B of float;; 

let plus x1:number x2:number = (number x1) + (number x2);; 

не компилируется. Но он похож на то, что я бы написал, если бы использовал язык программирования ML.

Какова должна быть моя функция plus в F #?

ответ

3
type number = A of int | B of float;; 

let plus x1:number x2:number = (number x1) + (number x2);; 

Проблема вы здесь двоякая:

  1. Вы не можете использовать дискриминационные случаи накидные, которые имеют один значение (в данном случае A и B), как если бы вы имели значение вместо этого. Подумайте о каждом случае как о классе, который имеет в нем одно значение (так оно представлено в байт-коде в любом случае). Прежде чем пытаться использовать его, вам нужно будет извлечь ценность из класса.

  2. F # не допускает неявное литье. Это означает, что, как только вы получите значения из ваших случаев, вам нужно будет преобразовать их в общий тип. В этом случае вам нужно либо присвоить значение A значение float, либо значение B на int.

Как @JohnPalmer отмечает в своем ответе, наиболее четким способом решения этих двух проблем является использование соответствия шаблонов.

+0

@downvoter Пожалуйста, объясните, почему –

2

Так что лучший способ сделать что-то вроде

let plus x1 x2 = 
    match x1,x2 with 
    |A(a),A(a2) -> float(a+a2) 
    |A(a),B(b) -> float(a) + b 
    |B(b),B(b2) -> b+b2 
    |B(b),A(a) -> float(a) + b 
+0

Это дает мне ошибку «дискриминатор шаблона» плюс «не определен», что я должен изменить? – jth41

+0

@ jth41 - было несколько опечаток, которые исправлены –

Смежные вопросы