2016-03-12 20 views
2
在F#

,以下是沒有道理的:OCaml的相當於F# 「%A」

let l = [1;2;3;4] 
let s = sprintf "%A" l 

其中 「%A」 打印幾乎任何常見的,甚至遞歸數據結構的格式化版本。

在ocaml中有類似的東西嗎?

+0

Ocaml沒有運行時類型信息。這意味着在運行時它不知道'l'是一個int列表。 'type t = A | B | C | D | E讓l2 = [B; C; d; E]'在運行時內存中完全相同。正確打印'l'和'l2'變得不可能,因爲它需要幫助(參見下面的答案)。類型推理又如何與%A一起工作? –

+0

@GoswinvonBrederlow在F#中,特殊要求是格式字符串在編譯時已知。 (這意味着你無法從資源文件等加載格式字符串)。編譯之後,printf調用以及格式字符串和參數都是靜態類型檢查的。例如在這裏看到:http://fsharpforfunandprofit.com/posts/printf/我只是假設,ocaml有一些類似的地方。 – BitTickler

+0

在ocaml中沒有這樣的編譯器魔術。格式字符串已經足夠神奇,許多人想用功能性解決方案替換它。 –

回答

2

有一些東西接近,%a定義符接受兩個參數,第一個是一個漂亮的打印機,類型'a,第二個是值類型'a。打印機的類型取決於所使用的printf函數的種類。例如,

open Core_kernel.Std 
open Format 

printf "%a" Int63.pp Int63.one 

當然,這很大程度上取決於圖書館的良好支持。如果沒有pp函數,爲該類型提供,那麼它是相當無用的。

另外還有一個custom_printf語法擴展可用於-pp和ppx。在此擴展中,您將模塊名稱放置在特定者的位置。該模塊必須具有to_string功能。 ppx版本在格式字符串前需要一個感嘆號:

printf !"%{Int63}" Int63.one 

還有一個轉儲功能,可通過Internet訪問。特別是您可以在Batteries庫中找到它。它在數據表示上進行遞歸,並以或多或少的人類可讀表示形式進行打印。但是這與格式化輸出無關。

+0

我看到了「%a」和格式化模塊。但它讓我覺得太複雜,不能真正考慮這樣一個每天的事情。我想我使用的電池包括ocaml版本,但我不知道電池在哪裏,或者如果我真的使用它們,或者使用那些舊的生鏽的指甲,並且從未刪除;) – BitTickler

+0

演示文稿確實有點複雜,但使用簡單而且非常普遍。另見[Fmt](http://erratique.ch/software/fmt)庫。 – Drup