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.