Haskell 레코드 구문에 불편한 점이 있습니다


9

하스켈 문법의 대부분은 순결의 아름다움을 가지고 있습니다. 그러나 레코드 구문은보기에 좋지 않습니다. 불편하다. C와 혼합 된 느낌이 들며 쉼표와 중괄호가 필요합니다. Haskell에는 탭, 라인 기반 분리 기능이 있습니다. 따라서 원래 필요한 것보다 너무 장황하게 보입니다. 왜 그런 식으로 설계 되었습니까?


4
나에게 하스켈은 모두 이상하게 느낀다. 어떡해?
직업

7
당신은 혼자가 아닙니다. 상당수의 사람들이 (현재의 화신) 기록에 대해 불평합니다.

Eonil : 레코드 구문 을 정말로 싫어 한다면 {-# NoTraditionalRecordSyntax #-} GHC 확장으로이를 비활성화 할 수 있습니다.
Daniel Díaz Carrete

답변:


8

디자인 커밋에 참여하지 않았지만 레코드 구문이 목록 구문과 일치하도록 형성되었다고 생각합니다. 모듈 내보내기 구문은 쉼표도 사용합니다. 레이아웃이 사용되는 유일한 실제 위치는 최상위 선언, where 절 및 do-notation입니다.

그 위에 주어진

data Foo = Foo {bar :: Int, baz :: Int}

쓰기

fnord x = x { bar = 4 }

중괄호가 없으면 나머지 구문과 충돌하고 레이아웃을 사용합니다.

fnord x = x
    bar = 4

구문이 매우 부서지기 쉽습니다. 잘못된 위치에 "where"를 추가하면 코드가 완전히 다른 것을 의미합니다.

Haskell의 레코드 상태가 마음에 들지 않으면 (그리고 혼자하지 않을 것입니다), Hfc 또는 자몽 레코드 와 같은 정교한 fclabels 또는 정교한 유형 클래스 해커 (후자는 두 가지가 아닙니다) 희미한 마음으로도 미치도록 강력합니다)

fclabels는 (yay pointfree)를 쓸 수있게합니다.

fnord = setL bar 4

만큼 잘

getBar = getL bar

그 위에 라벨을 구성하는 실제 raison d' etre가 있습니다.

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

흠. setL변경 가능 합니까 ? IO가 없습니까? 이해하기 어렵다 ...
Eonil

2
전혀, 레코드 구문과 마찬가지로 단일 필드가 변경된 레코드의 다른 (공유) 사본을 얻게됩니다. 변경 가능성이나 참조 투명성 위반이 없습니다.
barsoap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.