[haskell] GHCi를 사용할 때 함수에 대한 명시 적 유형 선언을 제공하는 방법은 무엇입니까?

GHCi 내 에서이 함수 ( learnyouahaskell 에서 가져옴 )에 해당하는 것을 어떻게 정의 합니까?

import Data.List

numUniques :: (Eq a) => [a] -> Int
numUniques = length . nub

유형 선언이 없으면 GHCi는 함수 정의를 받아들이지 만 결국에는 도움이되지 않는 유형이됩니다.

Prelude Data.List> import Data.List
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int

결과 함수는 단위 목록 만 매개 변수로받습니다.

GHCi에서 유형 선언을 제공하는 방법이 있습니까? 아니면 유형 선언이 필요하지 않은 이와 같은 함수를 정의하는 다른 방법이 있습니까?

나는 GHCi 가이드에서 명백한 단서를 보지 못했고 다음과 같은 표현으로 실험했습니다 (소용이 없음).

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int



답변

GHCi에서 유형 선언을 제공하는 방법이 있습니까?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub

아니면 유형 선언이 필요하지 않은 이와 같은 함수를 정의하는 다른 방법이 있습니까?

로 단 형성 제한을 해제 -XNoMonomorphismRestriction하면 올바른 유형이 유추됩니다.


답변

또한 표현식에 “점”(즉, 명시 적 변수)을 다시 추가하여 단 ​​형성 제한을 피할 수도 있습니다. 따라서 이것은 또한 올바른 유형을 제공합니다.

let numUniques x = length. 너브 $ x


답변

GHC 사용자 가이드는이를 달성하기위한 두 가지 추가 방법을 보여줍니다. 이 하위 섹션 에서는 :{:}구문을 소개 하며 다음과 같이 사용할 수 있습니다.

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}

또는 여러 줄 모드를 활성화 할 수 있습니다 .

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
|


답변