我正在使用具有单个值的联合类型作为我的ID类型安全:
type PositionIdType = PositionId Int
假设我有一个记录:
type alias Position =
{ id : PositionIdType
, x : Float
, y : Float
}
我知道我可以做一个记录破坏:
function : Position -> a
function { id } =
-- id is a PositionIdType
同样通过作业:
{ id } = Position (PositionId 99) 10 5
如果我也需要访问记录:
function : Position -> a
function ({ id } as position) =
-- id is a PositionIdType
-- position is a Position
还要破坏单一类型:
function : PositionIdType -> a
function (PositionId id) =
-- id is an Int
也可以通过作业:
(PositionId id) = (Position (PositionId 99) 10 5).id
是否有可能将这两者结合在一起?我尝试了几种不同的方法,但没有成功,例如:
getIdInt ((PositionId { id }) as position) = id
getIdInt ({(PositionId id)} as position) = id
getIdInt (({PositionId id}) as position) = id
我目前的解决方案是在let
/ in
块中执行此操作,该工作正常,但如果可能的话,跳过let块会非常好:
processPosition : Position -> a
processPosition ({id} as position) =
let
(PositionId id_) =
id
in
Http.post ("/position/" ++ id_) (positionEncoder position)
答案 0 :(得分:1)
截至今天(0.18.0
),无法在Record内部取消嵌套的Union Type值。
如果此功能无法登陆,则无法提供信息。
的参考资料元组是唯一允许嵌套解构的Elm类型。
nested ( x, ( y ) ) =
x + y
> nested ( 1, (1))
2 : number
只有if..else
表达式,case
表达式或者直接作为参数传递给函数时,才能对Union Type进行解构。
如果我要写getIdInt
:
getIdInt : Position -> Int
getIdInt { id } =
case id of
PositionId val ->
val
main =
Position (PositionId 99) 10 5
|> getIdInt
|> toString
|> text -- 99