Lớp Num của haskell cho phép cấu trúc đại số khá chung chung và có vẻ như nó được dùng để làm nhẫn. Khi nói về một chiếc nhẫn, nó thuận tiện để có thể đề cập một cách rõ ràng các đơn vị bổ sung và nhân của nó - có thể Num.Zero và Num.One - có một thứ như vậy với Num, một lớp khác bao gồm các đơn vị hoặc một số cách khác mà làm xong?đơn vị cho các vòng trong haskell trong Num hoặc Rational
Trả lời
Nếu trường hợp của bạn là Num
là một chiếc nhẫn, người ta hy vọng fromInteger
là một đồng cấu vòng và do đó 0
và 1
sẽ chỉ hoạt động. Điều này có thể không phải lúc nào cũng giữ. Num
trước các typeclasses có luật đại số là tiêu chuẩn. Ngoài ra, không may, nhiều trường hợp của Num
không phải là các vòng (chẳng hạn như số dấu phẩy động).
Num
không thực sự là cấu trúc vòng, vì nó cũng có "các thứ khác" như abs
, signum
và (hy vọng) vòng đồng cấu fromInteger
. Tôi có xu hướng nghĩ về nó như "có lẽ là nhẫn-với một số thứ khác."
Ví dụ: chiếc nhẫn của Gaussian rationals
import Data.Ratio
import Data.Complex
type GaussianRational = Complex Rational
zero :: GaussianRational
zero = 0
one :: GaussianRational
one = 1
EDIT: Kể từ Z là bước đầu trong Ring, ý tưởng sử dụng fromInteger
cách này thực sự làm cho rất nhiều ý nghĩa.
Toàn bộ gói algebra
được dành cho các loại mục đích này. Ví dụ, chúng tôi có
class (Rig r, Rng r) => Ring r
và duy trì chế đúc
class (Semiring r, Unital r, Monoidal r) => Rig r
class (Group r, Semiring r) => Rng r
class Multiplicative r => Unital r
class (Additive r, Abelian r, Multiplicative r) => Semiring r
class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r
class (LeftModule Natural m, RightModule Natural m) => Monoidal m
class (Semiring r, Additive m) => RightModule r m
class (Semiring r, Additive m) => LeftModule r m
class Multiplicative r
class Additive r
class Additive r => Abelian r
đó là ít nhất một cách để xây dựng lên một chiếc nhẫn. Nếu bạn đang làm đại số chung chung thì algebra
có thể đáng giá, nhưng hầu hết các thư viện chỉ mong đợi Num
.
đó là một gợi ý tốt! - miễn là một trong những chăm sóc để làm cho fromInteger 0 trả về số không và fromInteger 1 trả về 1 nó sẽ làm việc tốt! – simonize
@simonize Chữ số '1' đã là' từIntegral 1'. – AndrewC