簡體   English   中英

在 ADT 中的 Haskell 中定義非 Int 常量

[英]Defining non-Int constants in Haskell within an ADT

我正在學習 Haskell,作為該過程的一部分,我正在嘗試構建一個玩具程序,將披薩大小建模為代數數據類型。

到目前為止,我想出了這個:

    data Size = Small | Medium | Large | ExtraLarge
        deriving Show

從某種意義上說,這可以模擬有效尺寸是有限且已定義的事實,但它並沒有 model 的概念,即這些尺寸的數值有多大。

如此 SO post 中所建議的,一種解決方案可能是從Enum派生並寫入fromEnumtoEnum 再說一次,這些函數的簽名要求轉換是從那種類型到我不喜歡的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM