mtl, 변환기, monads-fd, monadLib 및 선택의 역설


91

Hackage에는 모나드 변환기를위한 여러 패키지가 있습니다.

  • mtl : Monad 변환기 라이브러리
  • 변압기 : 콘크리트 펑터 및 모나드 변압기
  • monads-fd : 기능적 종속성을 사용하는 Monad 클래스
  • monads-tf : 유형 패밀리를 사용하는 Monad 클래스
  • monadLib : 모나드 변환기 모음입니다.
  • mtl-tf : 유형 패밀리를 사용하는 Monad 변환기 라이브러리.
  • mmtl : 모듈 식 Monad 변환기 라이브러리
  • mtlx : '무료'복사본을 제공하는 유형 인덱스가있는 Monad 변환기 라이브러리.
  • compose-trans : 컴포저 블 모나드 변환기

(그리고 아마도 내가 놓친 것)

어느 것을 사용할까요?

mtl은 Haskell Platform의 하나이지만 reddit에서 계속해서 쿨하지 않다고 들었습니다.

하지만 어쨌든 선택의 나쁜 점은 좋은 것 아닌가요?

글쎄요, 예를 들어 데이터 접근 자의 작성자가 대중적인 선택을 충족시키기 위해이 모든 것을 만들어야하는 방법을 보았습니다.

  • data-accessor-monadLib 라이브러리 : monadLib의 모나드에 대한 접근 자 함수
  • data-accessor-monads-fd 라이브러리 : Accessor를 사용하여 monads-fd 상태 모나드 클래스의 상태에 액세스
  • data-accessor-monads-tf 라이브러리 : Accessor를 사용하여 monads-tf State 모나드 유형 패밀리의 상태에 액세스합니다.
  • data-accessor-mtl 라이브러리 : Accessor를 사용하여 mtl State monad 클래스의 상태에 액세스
  • data-accessor-transformers 라이브러리 : Accessor를 사용하여 변환기 상태 모나드의 상태에 액세스

이것이 계속되고 예를 들어 경쟁하는 여러 Arrow 패키지가 진화하면 다음과 같은 것을 볼 수 있다고 생각합니다.

그런 다음 spoonklink가 분기되면 Hackage가 디스크 공간을 다 써 버릴까 걱정합니다. :)

질문 :

  • 모나드 변환기 패키지가 많은 이유는 무엇입니까?
  • mtl [고려 됨]이 멋지지 않은 이유는 무엇입니까?
  • 주요 차이점은 무엇입니까?
  • 이러한 경쟁 패키지의 대부분은 Andy Gill이 작성했으며 Ross Paterson이 관리합니다. 이것은 이러한 패키지가 경쟁이 아니라 어떤 식 으로든 함께 작동한다는 것을 의미합니까? 그리고 Andy와 Ross는 자신의 패키지가 쓸모 없다고 생각합니까?
  • 당신과 나는 어느 것을 사용해야합니까?

2
이 링크는 나를 변압기 대 MTL 이해하는 데 도움 haskell.org/haskellwiki/Monad_Transformer_Library
브랜든 쿡

2
@jberryman 주석보려면 아래로 스크롤하십시오 ! mtl 또는 transfomers를 사용하면 호환됩니다!
소피

답변:


70

그들 중 한 무리는 거의 완전히 동일합니다.

  • mtlGHC 확장을 사용하지만 transformersHaskell 98입니다.
  • monads-fd및에 monads-tf대한 추가 기능으로 transformers, 각각 기능 종속성 및 유형 계열을 사용하여 mtl에서 누락 된 기능을 제공합니다 transformers.
  • mtl-tf되는 mtl유형 제품군을 사용하여 다시 구현.

따라서 본질적으로 mtl== transformers++ monads-fd, mtl-tf== transformers++ monads-tf. 향상된 이식성과 모듈성 transformers및 관련 패키지가 mtl요즘 쿨하지 않은 이유 라고 생각합니다.

mmtl그리고 mtlx모두 유사 및 / 또는 기반으로 것 같다 mtlAPI의 차이 및 추가 기능.

MonadLib문제에 대해 다소 다른 견해를 가지고있는 것 같지만 직접적으로 익숙하지 않습니다. 또한 다른 것보다 많은 GHC 확장을 사용하는 것 같습니다.

언뜻 보면 compose-trans모나드 변환기를 만들기위한 메타 프로그래밍과 비슷해 보입니다. Control.Monad.Trans어느 쪽 과 호환된다고 주장합니다 mtl.

어쨌든 다음 결정 알고리즘을 제안합니다.

  • 새 프로젝트에 표준 모나드가 필요합니까? Use transformers& co., 우리 mtl가 쉴 수 있도록 도와주세요 .
  • 이미 mtl대규모 프로젝트에서 사용 하고 있습니까? transformers완전히 호환되지는 않지만 아무도 전환하지 않는다고해서 당신을 죽일 수는 없습니다.
  • 다른 패키지 중 하나가 필요한 비정상적인 기능을 제공합니까? 직접 굴리는 것보다 사용하는 것이 좋습니다.
  • 여전히 불만족하십니까? 그것들을 모두 버리고, 다운로드하고 category-extras, 이해할 수없는 추상적 인 넌센스 의 절반을 가진 숨 막힐 정도로 일반적인 코드로 세상의 모든 문제를 해결하세요 .

2
mtl == 트랜스포머 ++ monads-fd 인 경우이 방식으로 구현할 수 없습니까? (교체를위한 단계로서) 데이터 접근 자
-mtl

2
@yairchu : 그래,하지만 내가 그것에 대해 무엇을 기대합니까? :) 이전 버전과의 호환성을 유지하는 것은 결코 쉬운 일이 아니며 주요 라이브러리를 변경하려면 시간, 노력 및 어느 정도의 커뮤니티 지원이 필요합니다. 모나드 트랜스포머 상황은 알려진 문제이지만 긴 샷에서 누구의 최우선 순위라고 생각하지 않습니다.
CA McCann

5
@yairchu : 기본적으로 수행되는 작업입니다. mtl의 다음 메이저 버전은 Transformers + monads-fd를 가져 오는 스텁이어야하며 해당 버전과의 호환성이 결정적인 요소가 될 것입니다. 그런 다음 라이브러리를 개별적으로 업데이트하여 mtl 1.1 및 1.2 모두와 호환되도록 할 수 있으며, 앱은 설치된 버전이나 가장 제한적인 라이브러리 종속성에 필요한 버전으로 이동합니다.
Edward KMETT

2
도서관 메일 링리스트는 현재 MonadIO (그리고 아마도 MonadTrans를 mtl에서 base로 옮기는 것에 대해 논의하고 있습니다. 비록 "MonadBase"가 MPTC, fundeps 등을 필요로한다는 사실에도 불구하고 MonadIO를 추출 할 것인지 아니면 더 일반적인 MonadBase를 추출 할 것인지에 대해 끊었습니다.) .
Edward KMETT

28
이 게시물이 매우 유익하다는 것을 알았 기 때문에. 나는 다른 googlers를 업데이트 할 것이라고 생각했습니다 .mtl은 이제 변환기에 의존하고 monads-fd는 이제 mtl 주변의 스텁입니다. 따라서 추가 기능이 필요한 경우 mtl을 사용하고 필요한 모든 것이 있으면 트랜스포머를 가져 오십시오.
jberryman 2011 년

19

순간? 아마도 mtl. 어떤 일이 일어나고은이다 transformers라이브러리는 방식으로 MTL 밖으로 고려되고 있음 monads-fdmonads-tf공존 할 평화적으로, 아직 그렇지가 마지막 검사에서 할 수 있습니다.

그렇게되면 당신은 가져올 수 있습니다 monads-fdtransformers것을 제외하고, 동일한 인터페이스를하고 (거의) 수 State의 별칭 것 등 StateT.

그래서 나는에 쓰고 싶지만 mtlState, Reader 등이 현재 s data로 대체 될 것이라는 사실에 의존하지 않습니다 type.

MonadLib Iavor가 작업해온 또 다른 대안으로, 모듈 이름을 다른 사람들과 공유하지 않기 때문에 안전하게 사용할 수 있지만 사용 패턴이 상당히 다릅니다.


4
어떤 의미에서 공존합니까? 동일한 패키지에서 사용합니까? 동일한 모듈로 가져 왔습니까? 동일한 트랜스포머 스택에 결합 하시겠습니까? Fundeps와 TF를 혼합하는 것은 일반적으로 나쁜 생각이라고 생각합니다. 어쨌든 나는 transformers& co를 광범위하게 사용하지 않았습니다 . 그러나 mtl일부 (상당히 단순한) 코드를 전환 할 때 와 비교 했을 때 약간의 API 차이 외에 다른 문제는 발견하지 못했습니다 .
CA McCann

4
문제는 주어진 모듈을 제공하는 하나의 패키지 만로드 할 수 있다는 사실로 귀결됩니다. 따라서 내부적으로도 mtl을 사용하는 라이브러리를 사용하는 경우 대안을 가져올 수 없습니다. 현재 정상적인 해킹 비율은 어떤 방식 으로든 내부적으로 mtl을 사용합니다. 많은 사람들이 타입 패밀리를 사용하는 것을 선호하고, monads-tf가이를 제공하지만, 지금은 Transformers + monads-fd 리팩토링이 완료 될 때까지 MTL이 전 이적으로 필요한 라이브러리를 사용하지 못하도록 코딩하는 잠금을 염두에 두십시오. . 여기에는 꽤 큰 티켓 항목이 포함됩니다.
Edward KMETT

1
Transformers + monads- (tf | fd)를 사용하면 장기적으로는 피클을 피할 수 있지만 아직은 없습니다. 그 동안 사용의 우세는 mtl에 찬성합니다. 업그레이드 경로는 mtl의 다음 메이저 버전이 monads-fd 및 변환기를 가져 오는 스텁으로 재정의되는 것으로 보입니다. 메이저 버전 브레이크는 어떤 버전을 얻었는지 상관하지 않는다고 (즉, State가 타입 별칭이나 데이터 타입이되는 것에 대해 신경 쓰지 않는다) cabal 파일에 좋은 방법을 제공하고 일단 메이저 버전 범프가 발생하면 사용하는 모든 라이브러리가 동일한 편향을 공유하는지 신경 쓸 필요가 없습니다.
Edward KMETT

1
따라서 궁극적으로 지금까지의 경험은 Transformers / monads- (tf | fd)가 지원하도록 설계된 것과 정확히 일치합니다. 그러나 그들이 작성된 이후에 깨달은 것은 커뮤니티가 라이브러리를 전환하는 데 매우 열악하다는 것입니다. 따라서 mtl을 재정의하고 업그레이드 경로를 명확히해야합니다.
Edward KMETT

자세한 설명에 감사드립니다! 분명히 내가 바꾼 코드에는 외부 종속성이 거의 없었습니다. 대부분 FFI 바인딩이라고 생각합니다. 나는 또한 모듈 이름 충돌이 ... 침략적이라는 것을 깨닫지 못했습니다. 그것은 실제로 일을 어색하게 만듭니다. :(
CA McCann

16

Edward Kmett가 그의 답변 에서 언급 한 내용을 제외하는 것은 2010 년 말에 완료되었습니다. 최종 결과는 monads-fd 이며, 변압기를 기반으로 구축 되어 mtl 버전 2가되었습니다 . 의 유비쿼터스의 결과로 MTL , 모나드-TF는 정말 유행하지 않았다. 2017 년 초부터 mtlTransformers 는 널리 사용되는 유일한 모나드 변환기 라이브러리입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.