簡體   English   中英

Haskell - 類型類的實例列表

[英]Haskell - List of instances of a Typeclass

我對Haskell相當新,為了做得更好,我正在努力創建一個簡單的Web服務器。 我想說明我如何表示可擴展的頁面,所以我的想法是讓網頁成為可渲染數據的列表(比如你如何制作一個在Java中實現某個接口的對象列表),其中Renderable是

class Renderable a where
    render :: a -> IO String

不幸的是,我了解到列表必須是具體類型,因此我只能列出一種可渲染數據。 此外,似乎無法創建受類型類約束的數據,因此我無法創建類似RenderList數據的內容。 我的臨時解決方案是這樣的:

myPage =
    [render $ someData
    ,render $ someMoreData
    ,render $ someOtherData
    ...
    ]

但這感覺很尷尬,使得類型類的使用沒有任何好處,並且感覺應該有更好的方法。 所以我想知道我可以采用哪些方法來重構我必須更清潔,更符合標准Haskell實踐,並且仍然可以輕松擴展?

謝謝。

您正在嘗試實現面向對象的設計風格。 例如,在Java中,你有一個List<Renderable> ,你就可以了。 這種設計風格在Haskell中不那么自然; 你需要為Haskell wiki頁面上為存在類型所展示的有界存在體創建一個包裝器類型 例如:

class Renderable_ a where
  render :: a -> IO String

data Renderable = forall a. Renderable_ a => Renderable a
instance Renderable_ Renderable where
  render (Renderable a) = render a

然后,您可以擁有一個Renderable列表,您可以根據需要進行渲染。 就像我說的那樣,這是一種OO風格,在Haskell中不那么自然。 您可以通過重新考慮數據結構來避免這種情況。 你說你“想要表達你如何表示可擴展的頁面”; 考慮其他方式來做到這一點。

不相關:我猜render不需要產生IO String動作。 如果可以的話,盡量讓IO脫離設計的核心。

查看有關haskell 異類集合的此頁面。 它提供了幾種方法的想法。

暫無
暫無

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

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