나는 쉬운 방법이 GHCi 7.8에서 사용할 수 typed holes를 사용하는 것을 알게 :
> (*10) <$> _a $ 1
Found hole ‘_a’ with type: s0 -> b
Where: ‘s0’ is an ambiguous type variable
‘b’ is a rigid type variable bound by
the inferred type of it :: b at <interactive>:4:1
Relevant bindings include it :: b (bound at <interactive>:4:1)
In the second argument of ‘(<$>)’, namely ‘_a’
In the expression: (* 10) <$> _a
In the expression: (* 10) <$> _a $ 1
그래서이 나에게 말한다 a :: s0 -> b
있다. (
> :i (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
infixl 4 <$>
> :i ($)
($) :: (a -> b) -> a -> b
infixr 0 $
그래서이 $
가 높은 마우스 오른쪽 연관이라고 말한다 주어진 그것은, 그래서 a
함수해야 우리가 첫 번째 인수 될 함수해야한다하다고 볼 입력의 : 다음 사업자의 순서를 파악하는 것입니다 이중 확인). 즉, (*10) <$> a $ 1
은 ((*10) <$> a) $ 1
과 동일하므로 먼저 (*10) <$> a
에 초점을 맞 춥니 다.
> :t ((*10) <$>)
((*10) <$>) :: (Num a, Functor f) => f a -> f a
> :t (<$> _a)
Found hole ‘_a’ with type: f a
Where: ‘a’ is a rigid type variable bound by
the inferred type of it :: (a -> b) -> f b at Top level
‘f’ is a rigid type variable bound by
the inferred type of it :: (a -> b) -> f b at Top level
In the second argument of ‘(<$>)’, namely ‘_a’
In the expression: (<$> _a)
그래서 우리는 functor가되도록 a
이 필요합니다. 사용 가능한 인스턴스는 무엇입니까?
> :i Functor
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
-- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘Data.Maybe’
instance Functor (Either a) -- Defined in ‘Data.Either’
instance Functor ZipList -- Defined in ‘Control.Applicative’
instance Monad m => Functor (WrappedMonad m)
-- Defined in ‘Control.Applicative’
instance Control.Arrow.Arrow a => Functor (WrappedArrow a b)
-- Defined in ‘Control.Applicative’
instance Functor (Const m) -- Defined in ‘Control.Applicative’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor IO -- Defined in ‘GHC.Base’
instance Functor ((->) r) -- Defined in ‘GHC.Base’
instance Functor ((,) a) -- Defined in ‘GHC.Base’
그래서 (->) r
우리가 a
함수이어야한다 알고 있기 때문에 굉장 하나 될 일이. Num
제약 조건에서 r
은 Num a => a
과 같아야합니다. 즉, (*10) <$> a :: Num a => a -> a
을 의미합니다. 그런 다음 1
을 적용하면 (*10) <$> a $ 1 :: Num a
이됩니다. 여기서 a
은 알 수없는 기능입니다.
이 모든 것은 GHCi를 사용하여 입력 된 구멍과 함께 :t
과 :i
을 사용하여 검색 할 수 있습니다. 물론, 상당한 수의 단계가 있지만, 복잡한 표현식을 분해하려고 할 때 결코 실패하지 않습니다. 다른 하위 표현식의 유형을 살펴보십시오.