2016-08-23 2 views
2

행 다형성 레코드를 나타내는 유형/별명을 정의하는 방법이 있습니까?다형성 레코드 유형 별명에 대한 구문

은 그래서

tester :: forall r. {val :: Int | r} -> Int 
tester a = 
    a.val 

callTester = tester {val: 1, b: 2} 

내가 별칭으로 레코드 유형을 정의 할 예에게 주어진. 비슷한 것

type Val = forall r. {val :: Int | r} 

tester :: Val -> Int 
tester a = 
    a.val 

callTester = tester {val: 1, b: 2} 

그러나 컴파일되지 않습니다.

형식이 여러 번 정의되는 더 큰 레코드와 더 복잡한 함수의 경우 많은 노이즈가 발생합니다. 이 문제를 해결하는 것이 좋을 것입니다. 예 : fn :: a -> b -> aa을 두 번 정의해야합니다.

비 다형성 레코드의 경우 간단하지만 명확하게 선행을 알지 못하는 추가 필드가있는 레코드를 허용하려고합니다.

감사합니다.

답변

3

다음은 위의 예에서 작동하는 방법입니다.

type Val r = {val :: Int | r} 

tester :: forall a. Val a -> Int 
tester v = 
    v.a 

callTester = tester {val: 1, b: 2} 

그래서 유형을 정의하고 유형

를 사용하여 기능에 forall