我正在嘗試將一個 CSV 檔案夾決議為一類不同的特定型別,然后將其編譯為單個 XLSX。我有不同的資料型別來表示記錄,因為雖然所有這些都屬于同一類事物,但它們具有不同的欄位和決議方法:
data RecordTypeA = RecordTypeA { ... }
data RecordTypeB = RecordTypeB { ... }
instance MyItemClass RecordTypeA where
...
instance MyItemClass RecordTypeB where
...
-- and loads of instances for parsing, serialising, etc..
嘗試這樣做時,我遇到了兩個問題:
首先,我無法撰寫一個將 aFilePath作為輸入并回傳適合該檔案的記錄串列的函式(我根據檔案名決定)。我遇到了“剛性型別變數”錯誤(類似于Haskell 中的剛性型別變數)。我想這是一種動態調度,但我不知道如何在 haskell 中實作它。
parseRecords :: FilePath -> ExceptT ProgrammeError IO [a]
parseRecords = {- parses based on the file name -}
-- uh oh: "... a is a rigid type variable ..."
其次,如果我有那個功能,我不完全確定我將如何表示這些多型型別的串列,因為它必須是一個異構串列,所有這些都受它們是特定型別類集的成員這一事實的約束. 我事先不知道會有多少不同型別的檔案。
processFiles :: FilePath -> ExceptT ProgrammeError IO (Compiled a)
processFiles = ???
如何在 Haskell 中實作這種多型決議?
uj5u.com熱心網友回復:
最直接的做法是將其降低到值級別,而不是在編譯時嘗試在型別級別上執行所有操作。定義一個新型別,它是您希望能夠在此背景關系中決議的所有內容的總和:
data SomeRecord = TypeA RecordTypeA | TypeB RecordTypeB ...
然后你可以做很多事情——例如,定義一個 type 串列[Parser SomeRecord],并從輸入的串列中運行每個決議器。或者根據檔案名,選擇不同的決議器串列。那么 的結果 parseRecords可以是[SomeRecord]。這不是最精確的型別:即使您提供的決議器串列不包含 TypeA 的決議器,您也必須應對回傳 TypeA 記錄的可能性,因為它們都是相同的型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359149.html
上一篇:Haskell少輸入測驗樣板
