榆树记录更新与别名类型不匹配

时间:2018-07-06 22:07:20

标签: record elm

我有以下类型:

type alias SelList a =
    { list : List a
    , selected : Maybe a
    }

Sel(ectable)List aa的列表,我可以从中选择一个元素。

在我的应用程序中,我所有的对象都有一个id : Int字段,因此我已经定义了此类型别名:

type alias HasId r = { r | id : Int}

现在我想让一个函数最终在列表中选择一个元素,我已经尝试过:

select : Int -> SelList (HasId r)-> Maybe (SelList (HasId r))
select id sl = find (\x-> x.id ==id) sl.list &> \ el ->
               Just { sl | selected = el }

其中(&>) = flip Maybe.andThenfind : (a -> Bool) -> List a -> Maybe a

我收到以下消息:

The type annotation for `select` says it always returns:

    Maybe (SelList (HasId r))

But the returned value (shown above) is a:

    Maybe { list : List (HasId r), selected : { r | id : Int } }

我很困惑,因为{ r | id : Int }HasId相同,然后

{ list : List (HasId r), selected : HasId r }

SelList (HasId r)相同。为什么编译器无法弄清楚类型是否匹配?

1 个答案:

答案 0 :(得分:1)

编译器的错误发生在90%的地方,但是我认为混合使用类型别名和记录会更难找出问题所在。 (Elm的未来版本将对此进行改进。)

如果它是记录而不是Maybe record,则编译器会告诉您“我看到selected字段有问题”之类的信息。有帮助吗?

扰流器:SelList类型具有selected : Maybe a,但是select返回selected : a