語境
重要的細節,我在repl.it上使用 Haskell(不是 CABAL) 。我想列印我創建的自定義 Haskell 資料型別。在創建新類時,我正在考慮一種類似于 Python__repr__或方法的方法。__str__就像是:
class Length:
def __init__(self, value, unit_of_measurement):
self.value = value
self.unit_of_measurement = unit_of_measurement
def __str__(self):
return f'{self.value}{self.unit_of_measurement}'
def __repr__(self):
return self.__str__()
這將產生以下內容:
>>> # I can print a custom representation of the object
>>> l = Length(10, 'cm')
>>> l
10cm
>>> print(l)
10cm
問題
我正在嘗試以Show我的自定義資料型別實體化該類,并使用模式匹配來自定義將發送到控制臺的輸出。
到目前為止我嘗試了什么
-- This works fine
data Length = Length {value :: Double, unit_of_measurement :: String}
deriving (Eq, Ord) -- I don't want to use default Show inheritance
-- These lines are actually wrong, but I don't know how to solve this
-- Also, how to get the fields declared in my datatype???
instance Show Length where -- Or IO, I am not sure
print Length = print $ show value unit_of_measurement
忽略我提到的錯誤行(因此編譯器不會停止執行)并考慮到我使用 Haskell 的內置繼承機制和Show( deriving(Show)) 這將是結果,(我不喜歡):
λ> :load Main.hs
[1 of 1] Compiling Main ( Main.hs, interpreted )
Ok, one module loaded.
λ> let test = Length 10 "cm"
λ> test
Length {value = 10.0, unit_of_measurement = "cm"} -- HERE ??, THIS IS THE PROBLEM
我理解是否不可能完全按照我的意愿去做,但是,有什么辦法可以做類似的事情嗎?提前致謝!
uj5u.com熱心網友回復:
Show呼叫型別類的方法show,而不是print。您需要洗掉對 的呼叫print。該show函式必須回傳一個普通的String,而不是一個IO ().
要對記錄進行模式匹配,您可以RecordWildCards通過在檔案的最頂部宣告??它來啟用語言擴展,然后在函式定義中使用Length{..}模式匹配并將記錄的所有欄位納入范圍。
{-# LANGUAGE RecordWildCards #-}
data Length = Length {value :: Double, unit_of_measurement :: String}
deriving (Eq, Ord)
instance Show Length where
show Length{..} = show value unit_of_measurement
如果沒有該語言擴展,您可以通過其他幾種方式訪問??記錄欄位:
show Length{value=v, unit_of_measurement=u} = show v u
show (Length v u) = show v u
show l = show (value l) unit_of_measurement l
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517169.html
