Haskell 일반 유형 매개 변수 해석기 도구 또는 방법 [중복]
예를 들어 이러한 함수의 유형을 살펴 보겠습니다.
:t traverse
traverse
:: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
:t id
id :: a -> a
그들은 구체적인 유형이 없지만,이 제네릭 형식 매개 변수를 : a
, f
, b
, t
(그들은 전화가 아닌 경우 정정 해줘 제네릭 형식 매개 변수 하시기 바랍니다)
나는 결합하는 경우 id
와 traverse
이런 식으로 함께
:t traverse id [Just 1, Just 2, Nothing]
traverse id [Just 1, Just 2, Nothing] :: Num b => Maybe [b]
하스켈 이제 형태 변수에 대한 몇 가지 구체적인 유형을 결합 할 수있다 a
, f
, b
, t
.
t = []
a = Maybe bb
f = Maybe
b = Num bb => bb
아래에서는 매개 변수에 대한 유형과 매핑을 수동으로 추론합니다. Haskell에서이를 자동으로 수행하는 방법이나 도구가 있습니까? 예에서 일부 구성된 부분 ( id
및 traverse
)을 사용하고 일반적으로 유형 서명을 추출하며 출력에서 일반 유형 매개 변수 이름에서 구체적인 유추 유형으로의 매핑?
여기에서 첫 번째 예를 참조하십시오. https://wiki.haskell.org/Type_inferencemap ord
하스켈이 이름에 대한 실제 유형의 바인딩을 찾는 방법에 대한 " " 표현식
우리가 기능을 볼 때 그래서 별도로 우리가 이름 만이 a
, f
, b
, t
. 그러나 우리가 결합 기능과 같은 몇 가지 추가 정보를 제공 [Just 1, Just 2, Nothing]
하고, 이름을 a
, f
, b
, t
콘크리트 종류에 매핑됩니다.
이 매핑을 자동으로 잡아서 표시하고 싶습니다.
답변
내가 생각 f
하고 t
더 있습니다 일반적인 유형 생성자의 매개 변수 가 당신에게 유형을 제공하는 형식에 따라 행동으로, (그들이 종류 입니다 * -> *
, 어디 *
수단 "구체적인 유형").
traverse id
id
에 인수 로 전달 하므로 구성이 아니라 함수 응용 프로그램 traverse
입니다. 수학적 의미에서 와 this . that
사이의 함수 구성으로 , (첫 번째) 인수를 입력 으로 제공하고이 응용 프로그램의 결과를에 공급 하는 함수를 만듭니다 .this
that
that
this
이 페이지 의 예를 참조하십시오.
map :: (a -> b) -> [a] -> [b]
Char.ord :: (Char -> Int)
컴파일러의 유형이 있음을 추론 할 수 map ord
있다 [Char] -> [Int]
당신이 작성하여 자신을 확인할 수있는, :t map ord
명령 줄에서.
을 입력 할 때 concerete 유형을 사용 하여 유사한 출력을 기대하면 구체적인 유형 인수와 유형 생성자 인수 모두에서 여전히 다형성 함수 인 :t traverse id
간단한 이유 때문에 얻을 수 없습니다 traverse id
.
약간 다른 예를 들자면,를 입력하면 :t traverse (:[])
, where (:[])
has type 은 예상 a -> [a]
되는 특정 경우입니다. 이 출력을 얻습니다.(Applicative f) => a -> f b
traverse
traverse (:[]) :: Traversable t => t b -> [t b]
와 비교 :t traverse
하면
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
있음을 알려줍니다 traverse
에, traverse (:[])
와 "인스턴스"하고있다 f === []
및 a === b
.