带有记录销毁的函数参数,它是单值联合类型,别名为

时间:2017-01-08 01:52:48

标签: elm

我正在使用具有单个值的联合类型作为我的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)

1 个答案:

答案 0 :(得分:1)

截至今天(0.18.0),无法在Record内部取消嵌套的Union Type值。

如果此功能无法登陆,则无法提供信息。

以下是record destructuring.

的参考资料

元组是唯一允许嵌套解构的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