문제

나는 최근에 기능적 프로그래밍 (Haskell과 Scala에서)에 대해 알게됩니다. 그것은 능력과 우아함이 아주 매력적입니다.

그러나 모노이드라는 대수적 인 구조를 사용하는 모나드를 만났을 때, 나는 놀랐고, 수학에서 배우는 이론 지식을 프로그래밍에서 사용하게 만들었습니다.

이 관찰은 내 마음에 질문을 가져 왔습니다. 그룹, 필드 또는 반지를 할 수 있습니다 ( "NoReferRer"> 대수 구조" 다른 사람들에게는 더 많은 추상화 및 코드 재사용 목적을 위해 프로그래밍에 사용되고 수학 - 비슷한 프로그래밍을 달성하고 있습니까?

알고 계시 며 "noreferrer"> 요새 (내가 어떤 언어를 한 번 이상 선호 할 것입니다) 컴파일러가 완료되면) 라이브러리 코드에서 이러한 구조를 정의합니다. 그러나 지금까지 지금까지 보았던 용도 만 우리는 이미 익숙한 숫자 유형이었습니다. 다른 용도가있을 수 있습니까?

최고의 안부, Ciun

도움이 되었습니까?

해결책

많은 구조를 모델링 할 수 있습니다.그룹 :

입니다
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)
.

이제 mult (Dual CAB, 5) (Dual CBA, 1)를 작성하고 결과를 얻을 수 있습니다.이것은 S 3 * ⨯ z의 계산이 될 것입니다. z. 다른 그룹을 추가하고 가능한 한 방식으로 계산을 결합 할 수 있습니다.

유사한 일은 반지, 필드, 주문, 벡터 공백, 범주 등으로 수행 할 수 있습니다. Haskell의 숫자 계층 구조는 불행히도 모델링되지만 숫자 PRELUDE 를 해결하려고 시도했습니다.또한 Docon 극단적 인 경우.종류 수업 여행 (주로 카테고리 이론에 의해 동기 부여), 예제 및 응용 프로그램의 큰 목록이있는 TypeClassopedia .

다른 팁

Edward Kmett의 매우 읽을 수있는 블로그 및 관련 카테고리 Extras 패키지.몇 년 동안 바쁘게 지내야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top