繁体   English   中英

具有单值联合类型和别名的记录析构函数参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM