簡體   English   中英

Haskell構造函數別名

[英]Haskell constructor aliases

有沒有辦法在Haskell中創建相當於創建“構造函數別名”的東西? 我認為類似於別名,你可以給類型一個不同的名稱,但它仍然以各種方式表現為別名類型。

我的用例是一個系統,我有一個指定的時間作為我正在建模的一些對象的屬性,所以UTCTime 其中一些可能是“可變”時間,這意味着它可能尚未分配時間或它所具有的時間是“可移動的”。 所以Maybe UTCTime

但只有部分對象具有可變時間。 其他人有固定的時間,系統必須作為一個常數; 當前分配給特定時間的時間變量的處理方式與固定時間不同。 現在建議Either UTCTime (Maybe UTCTime) ; 它可以是固定時間,也可以是未分配的可變時間。

通用類型似乎非常適合我正在嘗試建模的東西,所以使用它們感覺很自然。 不過,雖然這很明顯是什么Either UTCTime (Maybe UTCTime) ,它不是特別明顯這是什么意思,所以一些描述性的特殊情況下的名字就好了。

一個簡單的type Timeslot = Either UTCTime (Maybe UTCTime)肯定會清理我的類型簽名很多,但這對構造函數沒有任何作用。 我可以使用類似bound = Just來獲取構造值的名稱,但不能用於模式匹配。

在另一端,我可以用我想要的任何名稱定義自定義ADT,但是我失去了EitherMaybe類型的所有預定義功能。 或者更確切地說,我將一直來回應用轉換(我認為這並不比使用newtype包裝器的情況更糟,只是沒有效率保證,但我懷疑這無論如何都會成為瓶頸)。 我想要理解使用通用EitherMaybe函數來操作我的Timeslot值的代碼我需要知道標准構造函數映射到我想要使用的任何方式的方式,並且轉換函數將提供方便的編譯器強制定義那個映射。 所以也許這是一個很好的方法。

我很確定我知道Haskell很好地說沒有構造函數別名這樣的東西,但我很好奇是否有一些我不知道的hack,或者其他一些處理這種情況的好方法。

盡管你提到了一些缺點,但我強烈建議你為你的類型創建一個新的ADT; 例如

data TimeVariable = Constant UTCTime | Assigned UTCTime | Unassigned

我提出這些論點:

  1. 擁有描述性構造函數將使您的代碼(構造和模式匹配)更具可讀性。 比較UnassignedRight Nothing 現在添加六個月並進行相同的比較。
  2. 我懷疑隨着應用程序的增長,你會發現這種類型需要擴展。 使用自定義ADT可以更輕松地向現有構造函數添加另一個構造函數或其他字段,並且可以非常輕松地識別需要更新以處理新類型的代碼位置。
  3. 可能在這種類型上沒有那么多合理的操作,就像在標准庫中存在重復EitherMaybe值一樣 - 所以我敢打賭你不會像你想象的那樣復制幾乎相同數量的代碼。 雖然您可能正在復制某些代碼,但為您的構造函數描述性名稱提供相同的可讀性和重構原因,為您的函數提供描述性名稱是有價值的。
  4. 我親自寫了一些代碼,其中所有的金額都是Either ,我的所有產品都是(,) 那太差了。 我永遠無法記住一筆錢的哪一面意味着哪一件事; 在閱讀舊代碼時,我不得不經常提醒自己每個值應該是什么樣的概念類型(例如, Right並沒有告訴你,你是否在這里使用Right作為時間變量的一部分或者你也是其他一些東西的一部分懶得做ADT); 我不得不在精神上擴展類型別名; 從我的痛苦中學習。 ;-)

“模式同義詞”可能會合並到ghc中: http//ghc.haskell.org/trac/ghc/ticket/5144 在此期間還有-XViewPatterns,它允許您編寫如下內容:

type Timeslot = Either UTCTime (Maybe UTCTime)
fieldA = either Just (const Nothing)
fieldB = either (const Nothing) id


f (fieldA -> Just time) = ...
f (fieldB -> Just time) = ...
f _ = ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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