[英]Haskell. Using constraint to define an instance of a class
在嘗試理解Haskell中的實例時,我做了這個例子。 整數部分運行良好,但它不適用於Float實例。 我認為最好制作Num類型的單個實例(這樣正方形適用於所有Num)。 我想我必須添加Num作為我的類聲明的約束,但我無法弄清楚實例的樣子。 據我了解,類的約束強制任何實例屬於該類型(根據約束)。
class Square a where
area :: a -> a
instance Square Integer where
area a = a*a
instance Square Float where
area a = a*a
我認為最好制作
Num
類型的單個實例...
不是真的,除非你想只為Num
類型定義那個類(然后你根本不需要一個類,只需要將它作為area :: Num a => a->a
作為頂級函數)。
這是制作這樣一個通用實例的方法:
instance (Num a) => Square a where
area a = a*a
這不是Haskell98,但它確實適用於廣泛使用的-XFlexibleInstances
和-XUndecidableInstances
擴展。
問題:如果你還想添加,比方說,
instance Square String where
area str = concat $ replicate (length str) str
你有兩個重疊的實例 。 這是一個問題:通常,編譯器無法確定哪兩個這樣的實例是正確的。 同樣,GHC具有進行最佳猜測的擴展( -XOverlappingInstances
和-XIncoherentInstances
),但與Flexible/UndecidableInstances
不同,這些通常是避免的 。
因此, 我建議讓單獨的實例Square Int
, Square Integer
, Square Double
。 他們不是很難寫,不是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.