이것은 실제로 정확합니다. 레코드 필드의 이름은 서로 다른 컨텍스트에서 서로 다른 두 가지를 의미합니다.
- 개별 필드에있는 값 유형의 함수입니다.
- 패턴 매칭 및 구성에 사용할 수있는 마법의 기록 필드
GHCi
함수가 의미하는 바를 말하고 있지만 문서는 생성 할 함수가 아니라 레코드 필드 자체에 대해 이야기하고 있습니다.
본질적으로이 장면 뒤에
data Foo = Foo {fooy :: Int}
생성 할 것이다
fooy :: Foo -> Int
fooy Foo{fooy=fooy} = fooy
-- Equivalently: fooy Foo{fooy=bar} = bar
이 함수 fooy
는 코드에서 던지는 것이지만 문서는 레코드 선택기에 대해 이야기하고 있으며 Foo{fooy=...}
코드 의 일부 에서 볼 수 있습니다.
runStateT
필드 유형은 입니다 s -> m (a, s)
. runStateT
필드 접근 자 함수 의 유형은 입니다 StateT s m a -> s -> m (a, s)
.
더 간단한 예를 들어 보겠습니다.
data Foo = Bar {foo :: Int}
foo
필드 의 유형 (즉,Bar
생성자 에 입력 할 수있는 값 유형 )은Int
.foo
함수 유형은 입니다Foo -> Int
.
더 자세히 설명하려면 :
Bar {foo = 5}
5는 분명히 Int
.
let x = foo (Bar 5) in ...
다음 foo
은 Bar 5
유형 이있는에 적용됩니다 Foo
. 그래서 foo
a를 취하고 Foo
우리에게 5를주는 것 Int
입니다. 이것은 .
필드 runStateT
레코드에 대한 유형이다 s -> m (a,s)
그러나 (현장 접근) 기능 도 불리는이 runStateT
유형 인 StateT s m a -> s -> m (a,s)
은 (유형의 필드 값을 반환 즉 s -> m (a,s)
(유형의 기록 예를 들어) StateT s m a
)
출처
https://stackoverflow.com/questions/22019874