簡體   English   中英

哈斯克爾。 使用約束來定義類的實例

[英]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 IntSquare IntegerSquare Double 他們不是很難寫,不是嗎?

暫無
暫無

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

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