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


82

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

답변:


101

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

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

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

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


3
나는 아직 단 형성이 없지만 일반적 으로이 답변은 세미콜론을 사용하여 GHCi에서 정의를 그룹화하는 것을 가리 킵니다-튜토리얼은 .hs 파일처럼 작성되어 GHCi에서 시도했을 때 많은 다른 문제를 제공합니다 (함수에 바인딩이 없음 등) .).
Tomasz Gandor 2014 년

-XNoMonomorphismRestriction7.8.1 이후 GHCi에 대해 기본적으로 활성화되어 있다는 점 은 주목할 가치가 있습니다 . downloads.haskell.org/~ghc/latest/docs/html/users_guide/…
N. Shead

13

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

let numUniques x = length. 너브 $ x


1
감사합니다. 알아서 반가 웠습니다.
mattbh

이것은 eta-expansion으로 알려져 있습니다
Bladt

3

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

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

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

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.