[英]Function argument with a record destruct which is a single value union type, and alias
我正在使用带有单个值的联合类型作为我的 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.18.0
),对 Record 内嵌套的 Union Type 值的解构是不可能的。
此功能是否会登陆尚无信息。
Tuple 是唯一的 Elm 类型,它允许嵌套解构。
nested ( x, ( y ) ) =
x + y
> nested ( 1, (1))
2 : number
联合类型的if..else
只能使用if..else
表达式、 case
表达式或当它作为参数直接传递给函数时。
如果我要编写getIdInt
,我getIdInt
:
getIdInt : Position -> Int
getIdInt { id } =
case id of
PositionId val ->
val
main =
Position (PositionId 99) 10 5
|> getIdInt
|> toString
|> text -- 99
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.