2013-05-20 28 views
10

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

16

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 đó 01 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.

+0

đó 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

+3

@simonize Chữ số '1' đã là' từIntegral 1'. – AndrewC

4

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.