질문. 명시 적 형식 서명없이이 코드를 작동시키는 방법이 있습니까?GHC 유형 추론 재발
코드. 첫째, 실제로 연습중인 훨씬 더 좋은 대체물 MonadTrans
을 가지고 있는데, 이는 Data.Newtype
에서 영감을 받았습니다. 그것은 내가 방법 foo
와 클래스 A
있고, 일부 기본 모나드 M
는 A
경우, 다음 어떤 변화 모나드 T M
또한 A
이다, 그런 다음, 다음과 같이
{-# LANGUAGE FlexibleContexts, TypeFamilies #-}
module Alt.Control.Monad.Trans where
import Control.Monad
class (Monad , Monad (BaseMonad)) => MonadTrans (:: * -> *) where
type BaseMonad :: * -> *
lift :: (BaseMonad) α -> α
보인다. 지금 교체의 첫 번째 인수로 foo
에 대한 바로 가기를 만들려면 코드에서
class A where
foo :: String -> ()
instance (A (BaseMonad), MonadTrans) => A where
foo n = lift $ foo n
그러나, 나는이 명시 적 타입 서명, 또는 컴파일러의 컨텍스트 스택 오버 플로우가 필요합니다.
minimize_call :: A => ()
minimize_call = foo "minimize"
가능한 정보는 추론를 도움이됩니다. 연결된 유형이 B :: * -> *
이라고 가정 해 보겠습니다. 나는 컴파일러에게 B
이 B t /= t
, B (B t) /= B t
등을 만족 시키려고한다고 생각하고있다. 즉 B
은 "단조롭다"- 연관된 유형을 추적하는 것은 newtype 래퍼를 제거하는 것과 동일하며, newtype 래퍼를 영원히 제거 할 수 없다는 것을 알아야한다. 따라서 서명에 컨텍스트 A
을 추가해야합니다.
죄송합니다. 나는 대체 MonadTrans로 전환했음을 기억해야합니다. 지금은 더 깨끗한 코드를 생성한다고 가정 해 봅시다. 그러나 더 중요한 이유가 있다고 생각합니다. – gatoatigrado
흥미로운 질문입니다. 그래도 명백한 형식 서명을 원하십니까? 'minimize_call'은 다형성 상수가 아닌 고정 값이어야합니다 (아니면 다형성이 될 수 있습니다, 확실하지 않습니다)? 고정 된 단일 유형이있는 경우 그 사실을 문서로 작성하고, 그렇지 않은 경우에는 ** 그 문서 **를 작성합니다. 독자가 자신의 머리에서 전체 프로그램 분석을 수행하여'minimize_call '유형이 다소 비생산적인 것으로 파악되는지 확인하십시오. – Ben
@Ben,이 경우에는'minimize_call'에 대한 타입 서명을하는 것이 좋은 습관입니다.그러나 형식 유추가 끊어진다는 것은 컴파일러에 대한 디자인, 컴파일러 또는 통신과 관련하여 문제가 발생했음을 나타내며, 알 수없는 오류 메시지는 말할 것도없고 문제를 일으킬 수 있습니다. – gatoatigrado