Haskell 支持型別類,例如相等:
class Eq a where
(==) :: a -> a -> Bool
Rust 對型別特征做同樣的事情:
pub trait Draw {
fn draw(&self);
}
現在,可以在 Haskell 中宣告一個串列,其元素必須屬于相等型別類:(Eq a => [a]我相信在 Haskella中稱為約束型別)。但是,串列的元素仍然必須是同一型別!說,全部Integer或全部Float或某事。然而,在 Rust 中,可以有一個值串列(一個向量),其中每個值都實作了一個給定的特征,但它們不一定是相同的具體型別:Vec<Box<dyn Draw>>. 有沒有辦法在 Haskell 中做同樣的事情?就像,我想要一個值串列,但我關心的是每個值都屬于某個型別類,但不一定是相同的具體型別。
uj5u.com熱心網友回復:
在 Haskell 中,您可以使用存在型別來表示“此型別類的某些未知型別”。(在舊版本的 GHC 中,您將需要一些標準擴展。)
class Draw a where
-- whatever the methods are
data SomeDraw where
SD :: Draw a => a -> SomeDraw
type MyList = [SomeDraw]
但是,請注意,這通常是矯枉過正,并導致已知的反模式。
例如,如果我們有一個類如下:
class Draw a where
draw :: a -> String
那么MyList上面的型別是同構的[String](或者至少在道德上是這樣的)。與直接存盤字串相比,存盤未知“可繪制”物件的唯一方法將其轉換為字串沒有任何優勢。另請注意,Haskell 是惰性的,因此您可以“存盤尚未評估的字串”,可以這么說。
無論如何,型別類的存在量化也可以以通用方式定義:
import Data.Kind
-- Ex has the same role of "dyn" in Rust here
data Ex (c :: Type -> Constraint) where
Ex :: c a => a -> Ex c
type MyList = [Ex Draw]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427307.html
標籤:哈斯克尔
上一篇:檢查它是否接受至少一個長度為k的單詞的有限行列式自動機,如果是-列印它,否則-列印“否”
下一篇:另一個可能用于“查找最小值”功能
