17

Gần đây tôi đã biết về lập trình hàm (trong Haskell và Scala). Đó là khả năng và sự thanh lịch khá quyến rũ.Có cấu trúc đại số nào được sử dụng trong lập trình hàm khác không?

Nhưng khi tôi gặp Monads, sử dụng cấu trúc đại số có tên Monoid, tôi đã rất ngạc nhiên và vui mừng khi thấy kiến ​​thức lý thuyết mà tôi đã học từ Toán học được sử dụng trong lập trình.

Quan sát này đưa ra một câu hỏi: Nhóm, trường hoặc nhẫn (xem Algebraic Structures cho người khác) có được sử dụng trong lập trình cho mục đích tái sử dụng mã và trừu tượng hơn và đạt được lập trình toán học không?

Như tôi biết, ngôn ngữ có tên Fortress (mà tôi chắc chắn sẽ thích hơn bất kỳ ngôn ngữ nào khi trình biên dịch của nó được hoàn thành) xác định cấu trúc này trong mã thư viện của nó. Nhưng chỉ sử dụng tôi thấy cho đến nay là cho các loại số, mà chúng tôi đã quen thuộc với. Có thể có bất kỳ cách sử dụng nào khác của họ không?

Trân trọng, ciun

+0

Đây không phải chính xác những gì bạn đang tìm kiếm, nhưng bài viết * The Typeclassopedia * trong [vấn đề 13 của The Monad.Reader] (http://www.haskell.org/wikiupload/8/85/TMR- Issue13.pdf) vẫn có thể được quan tâm: Đó là một lời giải thích chi tiết của một số loại lớp ('Functor',' Applicative', 'Monoid',' Monad', 'Arrow', vv) từ Haskell Prelude. – stakx

Trả lời

10

Bạn có thể lập mô hình nhiều cấu trúc. Đây là một nhóm:

class Group a where 
    mult :: a -> a -> a 
    identity :: a 
    inverse :: a -> a 

instance Group Integer where 
    mult = (+) 
    identity = 0 
    inverse = negate 

-- S_3 (group of all bijections of a 3-element set) 
data S3 = ABC | ACB | BAC | BCA | CAB | CBA 
instance Group S3 where 
    mult ABC x = x 
    ... -- some boring code 
    identity = ABC 
    inverse ABC = ABC 
    ... -- remaining cases 

-- Operations on groups. Dual: 
data Dual a = Dual { getDual :: a } 
instance Group a => Group (Dual a) where 
    mult (Dual x) (Dual y) = Dual (mult y x) 
    identity = Dual identity 
    inverse (Dual x) = Dual (inverse x) 

-- Product: 
instance (Group a, Group b) => Group (a,b) where 
    mult (x,y) (z,t) = (x `mult` z, y `mult` t) 
    identity = (identity, identity) 
    inverse (x,y) = (inverse x, inverse y) 

Bây giờ, bạn có thể viết mult (Dual CAB, 5) (Dual CBA, 1) và nhận kết quả. Đây sẽ là một tính toán trong nhóm S * ⨯ Z. Bạn có thể thêm các nhóm khác, kết hợp chúng theo bất kỳ cách nào có thể và thực hiện tính toán với chúng.

Những việc tương tự có thể được thực hiện với các vòng, trường, thứ tự, không gian vectơ, danh mục,… Hệ thống phân cấp số của Haskell không được mô hình hóa xấu, nhưng có numeric prelude cố gắng sửa lỗi đó. Ngoài ra còn có DoCon khiến nó trở nên cực đoan. Đối với một tour du lịch của các lớp loại (chủ yếu là thúc đẩy bởi lý thuyết thể loại), có Typeclassopedia trong đó có một danh sách lớn các ví dụ và các ứng dụng.

3

Haskell của Arrows là một sự tổng quát của monads và có lẽ có liên quan.

2

Tôi muốn giới thiệu Edward Kmett rất dễ đọc blog và gói category extras có liên quan. Nên giữ cho bạn bận rộn trong nhiều năm.

Các vấn đề liên quan