我有以下类型:
type alias SelList a =
{ list : List a
, selected : Maybe a
}
Sel(ectable)List a
是a
的列表,我可以从中选择一个元素。
在我的应用程序中,我所有的对象都有一个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.andThen
和find : (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)
相同。为什么编译器无法弄清楚类型是否匹配?
答案 0 :(得分:1)
编译器的错误发生在90%的地方,但是我认为混合使用类型别名和记录会更难找出问题所在。 (Elm的未来版本将对此进行改进。)
如果它是记录而不是Maybe record
,则编译器会告诉您“我看到selected
字段有问题”之类的信息。有帮助吗?
扰流器:SelList
类型具有selected : Maybe a
,但是select
返回selected : a