2017-04-10 4 views
0

유형 생성자 :평범한 포인터가 일반적인 연산 인 &와 *와 함께 모나드입니까?

template< typename T > T*; 

단위 연산자

template< typename T > T* unit(T /*or T&*/ t) { return &t; } 

바인드 운영자

template< typename A, typename B > 
B* bind(A a, std::function<b*(a)> f) 
{ return a ? f(a) : nullptr; } 

모나드 법률

bind(unit(x), f) === f(x) 
bind(bind(x, f1), f2) === auto a = f1(x); auto b = f2(a); return b; 
+2

'단위'가 좌변 치 참조를 사용하지 않으면 변수 모자에 대한 포인터가 더 이상 존재하지 않습니다. – NathanOliver

+1

'unit = std :: addressof'? 타입 생성자 ='std :: add_pointer_t'? –

+1

'template T *;가 무엇입니까? – aschepler

답변

2

는 T에 대한 포인터는 T의]을 참조를 통해 모나드이다 T 이상이 아닌 nces; 선택적인 T는 T에 대한 모나드이다.

이 구분은 기능적 언어에서 빠지면 중요하다. 참조는 수명이 있으며 포인터는 그 수명을 따릅니다.

나는 전통적인 이름과 일치하는 기능의 부족이 중요하지 않다는 것에 동의한다; 문맥에서 사용 가능한 한 이진 가산 연산자가 +으로 표시되지 않더라도 벡터 공간은 벡터 공간으로 유지됩니다.

+0

응답을위한 감사합니다. 나는 (적절한 수학적 배경이 부족한) 모나드를 파악하기 위해 고심하고 있으며 C 언어에 대한 비교는 가치가있다. – Vorac