2011-09-22 35 views
11

Tôi không thể sử dụng print_endline vì nó yêu cầu một chuỗi và tôi không (nghĩ) tôi có bất kỳ cách nào để chuyển đổi các kiểu dữ liệu do người dùng xác định rất đơn giản thành chuỗi. Làm thế nào tôi có thể kiểm tra các giá trị của các biến của các kiểu dữ liệu này?Có cách nào để in các kiểu dữ liệu do người dùng định nghĩa trong ocaml không?

+0

http://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing – ygrek

+0

http://stackoverflow.com/questions/7380755/ocaml-get-values-type-name – ygrek

Trả lời

7

Trong nhiều trường hợp, không khó để viết thói quen chuyển đổi chuỗi_of_ của riêng bạn. Đó là một lựa chọn đơn giản mà không yêu cầu bất kỳ thư viện bổ sung hoặc phần mở rộng OCaml không chuẩn. Đối với các khóa học tôi dạy sử dụng OCaml, đây thường là cơ chế đơn giản nhất cho sinh viên.

(Nó sẽ được tốt đẹp nếu có sự ủng hộ cho một chuyển đổi chung thành các chuỗi mặc dù,. Có lẽ là bắt nguồn thứ OCaml sẽ bắt trên)

+6

Điều này là những gì tôi đã làm. Ngẫu nhiên, tôi tin rằng tôi thực sự trong lớp của bạn. – tessr

+1

Tôi nghĩ như vậy, dựa trên thời gian của câu hỏi ... :-) – stevez

8

Không có ngôn ngữ cơ bản nào thực hiện điều này cho bạn. Có một dự án có tên là OCaml Deriving (được đặt tên theo một tính năng của Haskell) có thể tự động lấy được các chức năng in từ các khai báo kiểu. Tôi đã không sử dụng nó, nhưng nó có vẻ tuyệt vời.

http://code.google.com/p/deriving/

Một khi bạn có một hàm để in loại của bạn (có nguồn gốc hay không), bạn có thể cài đặt nó trong top-level ocaml. Điều này có thể hữu ích, vì việc in ấn ở mức cao nhất đôi khi không thực hiện được những gì bạn muốn. Để thực hiện việc này, hãy sử dụng chỉ thị #install-printer, được mô tả trong Chapter 9 of the OCaml Manual.

3

Có chức năng thư viện của bên thứ ba như dump trong pin OCaml Bao gồm hoặc OCaml Extlib, sẽ biến đổi chung bất kỳ giá trị nào thành chuỗi bằng cách sử dụng tất cả thông tin thời gian chạy mà nó có thể nhận được. Nhưng điều này sẽ không thể phục hồi tất cả thông tin; ví dụ, tên hàm dựng bị mất và trở thành chỉ số nguyên, vì vậy nó sẽ không chính xác theo cách bạn muốn. Về cơ bản bạn sẽ phải viết các chức năng chuyển đổi của riêng bạn, hoặc sử dụng một số công cụ sẽ viết chúng cho bạn.

0

Dọc theo dòng câu trả lời trước, ppx_sexp là một PPX để tạo ra máy in từ định nghĩa kiểu. Dưới đây là một ví dụ về cách sử dụng nó trong khi sử dụng jbuilder làm hệ thống xây dựng của bạn, và sử dụng Base và Stdio làm stdlib của bạn.

Thứ nhất, tập tin jbuild đó quy định cụ thể như thế nào để thực hiện xây dựng:

(jbuild_version 1) 

(executables 
((names (w)) 
    (libraries (base stdio)) 
    (preprocess (pps (ppx_jane ppx_driver.runner))) 
)) 

Và đây là các mã.

open Base 
open Stdio 

type t = { a: int; b: float * float } 
[@@deriving sexp] 

let() = 
    let x = { a = 3; b = (4.5,5.6) } in 
    [%sexp (x : t)] |> Sexp.to_string_hum |> print_endline 

Và khi bạn chạy nó, bạn nhận được kết quả này:

((a 3) (b (4.5 5.6))) 

S-biểu hiện chuyển đổi có mặt trên khắp cơ sở và tất cả các thư viện liên quan (stdio, Core_kernel, Core, async, Incremental vv), và vì vậy bạn có thể đếm khá nhiều vào việc có thể sắp xếp bất kỳ cấu trúc dữ liệu nào bạn gặp phải ở đó, cũng như bất kỳ thứ gì bạn tự định nghĩa.

Các vấn đề liên quan