Đây là một vấn đề thách thức hơn là một vấn đề hữu ích (tôi đã dành một vài giờ trên đó). Đưa ra một số chức năng,Cách viết một họ các chức năng printf (gỡ lỗi in, vv) trong Haskell
put_debug, put_err :: String -> IO()
put_foo :: String -> StateT [String] m()
Tôi muốn viết một hàm printf tổng quát, gọi nó là gprint, như vậy tôi có thể viết
pdebug = gprint put_debug
perr = gprint put_err
pfoo = gprint put_foo
và sau đó sử dụng pdebug
, perr
, và pfoo
như printf
, ví dụ ,
pdebug "Hi"
pdebug "my value: %d" 1
pdebug "two values: %d, %d" 1 2
Tôi không thể xoay xở để có được một lớp học tổng quát đầy đủ. nỗ lực của tôi đã được điều tương tự (đối với những người quen thuộc với Printf
, hoặc cách tiếp cận chức năng variadic Oleg của)
class PrintfTyp r where
type AppendArg r a :: *
spr :: (String -> a) -> String -> [UPrintf] -> AppendArg r a
hoặc
class PrintfTyp r where
type KRetTyp r :: *
spr :: (String -> KRetTyp r) -> String -> [UPrintf] -> r
Cả hai đều quá khó khăn để viết các trường hợp cơ sở cho: không có lựa chọn tốt cho r
cho cách tiếp cận đầu tiên (và, kiểu của nó không được phản ánh trong họ loại được đánh chỉ mục không tiêm), và trong phương pháp thứ hai, một kết thúc bằng văn bản instance PrintfTyp a
trông sai (khớp với quá nhiều loại).
Một lần nữa, nó chỉ là một vấn đề thách thức: làm điều đó chỉ khi đó là niềm vui. Tôi chắc chắn sẽ tò mò muốn biết câu trả lời. Cảm ơn!!
Ừ , Tôi muốn tránh các terminators. Tôi muốn được quan tâm nhiều hơn chỉ hỗ trợ một đối số, tức là không hỗ trợ trường hợp 'pdebug 'không có đối số" '. Cảm ơn mặc dù. – gatoatigrado