2011-06-03 77 views
3

考慮以下類型定義:轉換一個多態類型爲字符串(「A - >字符串)

type 'a range = Full | Range of ('a * 'a);; 

如何轉換這種類型的值轉換爲字符串?

我目前有:

let string_of_range r = match r with 
    | Full -> "Full" 
    | Range(a,b) -> "Range("^(string_of_int a)^","^(string_of_int b)^")";; 

當然不過,這說a和b是int類型的。它們也可以是浮動或字符(查看關於約束型我剛纔的問題)

回答

8

改變你的函數接受一個字符串轉換器和您的實現中使用它。然後當你打電話時,通過一個合適的轉換器和範圍。喜歡的東西:

let string_of_range str_conv = function 
    | Full -> "Full" 
    | Range(a, b) -> "Range ("^(str_conv a)^", "^(str_conv b)^")" 

這將有類型:string_of_range : ('a -> string) -> 'a range -> string

調用示例:

string_of_range string_of_int (Range (1, 2)) 

有序這種方式,你可以很容易地使更多的專業轉換器。

let string_of_int_range = string_of_range string_of_int 

這將有類型:string_of_int_range : int range -> string

0

怎麼樣讓你的數據類型爲:

type 'a range = Full | Range of ('a * 'a * ('a -> string));; 
+0

我覺得嵌入轉換器,而它的工作,是不是這樣一個簡單的代數類型特別實用的方法。 – yzzlr 2011-06-05 13:40:01

2

如果使用sexplib你可以得到這種轉換器免費的。一旦你打開語法擴展,然後寫這樣的:

​​

會自動生成功能與此簽名

val sexp_of_range : ('a -> Sexp.t) -> 'a range -> Sexp.t 

如果你聲明:

type int_range = int range with sexp 

你會獲得

val sexp_of_int_range : int range -> Sexp.t 

你甚至可以做在線創建適當的轉換器:

let to_string range = Sexp.to_string (<:sexp_of<int range>> range) 
相關問題