형식이 Uuid
인 id
필드가있는 레코드의 형식을 지정하려고합니다. 그래서, 나는 확장 가능한 레코드를 사용하고있다. 유형은 다음과 같습니다.확장 가능 레코드 및 고차 함수
type alias WithId a = { a | id : Uuid }
지금까지는 그렇게 좋았습니다. 그런 다음 Json.Encoder
즉이 유형의 유형 인 WithId a -> Value
의 함수를 만들려고했습니다. 기본 값을 인코딩하는 방법이 필요하므로 형식 a -> Value
의 첫 번째 인수를 원합니다. 엘름이 Value
에 대한 데이터 유형을 공개하지 않더라도 a
이 레코드라는 것을 알고 있으므로 안전하게 JSON 객체로 인코딩된다고 가정 할 수 있습니다.
The argument to function `encoder` is causing a mismatch.
27| encoder a
^
Function `encoder` is expecting the argument to be:
a
But it is:
WithId a
Hint: Your type annotation uses type variable `a` which means any type of value
can flow through. Your code is saying it CANNOT be anything though! Maybe change
your type annotation to be more specific? Maybe the code has a problem? More at:
<https://github.com/elm-lang/elm-compiler/blob/0.18.0/hints/type-annotations.md>
Detected errors in 1 module.
내가 혼란 스러워요 : 나는 그런 기능을 만들 때
그러나, 나는 컴파일 오류가 발생합니다. 형식이 WithId a
인 경우 a
의 모든 입력란을 포함하지 않으므로 WithId a
은 a
에서 type alias
구조 지정 유형이 아니어야합니까?
무엇이 누락 되었습니까? WithId a
의 유형 별칭이 으로 정의되어 있어도 의 인스턴스로 WithId a
을 사용할 수있는 이유는 무엇입니까?
부칙
나는 (". 당신은 그냥 할 수는 없지만, 여기가 일을 할 거 야 무슨"하는 금액) 아래에 답을 표시 한,하지만, 난 여전히 해요 조금은 만족하지 못했다. 나는 type alias
이라는 용어의 사용에 대해 혼란스러워합니다. 필자가 이해할 수있는 것은 레코드가 항상 type alias
이라는 것입니다. 왜냐하면 그들은 가능한 모든 필드 중에서 필드의 서브 세트를 명시 적으로 지정했기 때문입니다. 그러나 기본 유형은 여전히 통합 레코드 유형 (JS 오브젝트와 유사)이었습니다.
type alias Foo = { bar : Int }
대신 나에게
type Foo = { bar : Int }
전 의미 { bar : Int }
어떤 기록이 나에게 의미하는 것 Foo
이라고 :
나는 우리가 말하는 이유를 이해하지 못하는 것 같아요 {a|bar:Int}
은 모두 a
및 Foo
과 동일한 유형입니다. 내가 여기서 뭐라구? 나는 혼란스러워. 나는 내가 기록을 깨우지 않는 것처럼 느낀다.
부칙 2
내 목표는 단지 유형 필드에 .id
이 지정하는 것이 아니라 두 가지 유형 가지고 WithId
가지고되지 않습니다 : Foo
이 { bar:Int }
및 WithId Foo
는이 구조를 가지고 어디 Foo
및 WithId Foo
을 구조 { bar:Int, id:Uuid}
. 나는 또한 WithId Baz
, WithId Quux
등을 가지고 싶습니다. WithId a
에 대해 단일 인코더 및 단일 디코더 기능이 있습니다.
기본 문제는 내가 지속되고 비 지속되는 데이터입니다. 단 하나의 데이터가 유지되면 ID가 있다는 점만 다릅니다.그리고 특정 유형의 레코드가 지속되도록하는 유형 수준 보증을 원하므로 Maybe
이 작동하지 않습니다. 우리가 WithId a
의 인스턴스에 대해 알고
레코드의 경우, 나는 문제를 해결할 수있는 확장 가능한 레코드를 포기하고'(Uuid, a) '튜플 주위의 형식 별칭을 사용했습니다. 내가 원했던만큼 훌륭한 API는 아니지만 작동합니다. 나는 왜 내가하고 싶은 일을 할 수 없는지 혼란 스럽다. –
다음은 Elm 커뮤니티의 오래되고 반복되는 대화입니다 : https://github.com/elm-lang/elm-compiler/issues/1308#issuecomment-197170407 –