[英]Defining non-Int constants in Haskell within an ADT
我正在學習 Haskell,作為該過程的一部分,我正在嘗試構建一個玩具程序,將披薩大小建模為代數數據類型。
到目前為止,我想出了這個:
data Size = Small | Medium | Large | ExtraLarge
deriving Show
從某種意義上說,這可以模擬有效尺寸是有限且已定義的事實,但它並沒有 model 的概念,即這些尺寸的數值有多大。
正如此 SO post 中所建議的,一種解決方案可能是從Enum
派生並寫入fromEnum
和toEnum
。 再說一次,這些函數的簽名要求轉換是從那種類型到我不喜歡的Int
- 首先是因為大小自然不是Int
,然后因為我可能決定使用自定義數據類型(例如, Inch
)。
我可以創建一堆常量,例如:
Small = 9.5
Medium = 11.5
...
但我也想將它們分組為“適當的”數據類型。
任何建議如何前進?
您可以定義一個 function,將每個大小值關聯到一個數值。 例如
sizeToInch :: Size -> Double
sizeToInch Small = 9.5
sizeToInch Medium = 11.5
...
如果需要,您還可以使用自定義類型來更好地表示單位:
newtype Inch = Inch { fromInch :: Double }
sizeToInch :: Size -> Inch
sizeToInch Small = Inch 9.5
sizeToInch Medium = Inch 11.5
...
請注意,上述Inch
類型不允許您使用+
直接對Inch
值求和,或使用標准運算符執行任何其他算術運算。 您可能希望添加deriving Num
以啟用該類型的標准運算符。 不過,這也將允許乘法,這並不理想(平方英寸不是英寸)。 有一些庫(如dimensional
)可以嚴格處理單位,但對於這樣一個簡單的任務來說,它們可能是矯枉過正的。 選擇您最滿意的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.