如何从列表中获取不同的项目?

时间:2017-11-10 12:58:29

标签: elm

我不清楚如何从列表中检索不同的项目。

我有以下代码:

topicsFromLinks : List Link -> List Topic
topicsFromLinks links =
    links
        |> List.map (\l -> l.topics)
        |> List.concat
        |> Set.fromList
        |> Set.toList

错误:

  

topicsFromLinks的定义与其类型不匹配   注解。 - topicsFromLinks的类型注释始终表示   返回:

List Topic
     

但是返回的值(如上所示)是:

List comparable

我希望以下几行能够在结构平等方面发挥作用:

|> Set.fromList
|> Set.toList

为什么我会收到可比较物品清单?

如何解决此编译错误?

附录

type alias Topic =
    { name : String, isFeatured : Bool }

type alias Link =
    {
    ...
    , topics : List Topic
    ...
    }

1 个答案:

答案 0 :(得分:5)

根据documentation for Set

  

值可以是任何类似的类型。这包括Int,Float,Time,Char,String和元组或类似类型的列表。

您试图将Topic值放在只有类似类型可用的位置。

值得庆幸的是,elm-community/list-extra包含了一个uniqueBy函数,它允许您指定自己的函数以将某些内容转换为可比较的函数。

如果您想获取不同的主题列表,并在nameisFeatured字段上进行匹配,那么您可以使用toString将值序列化为可比较的值:

import List.Extra exposing (uniqueBy)

topicsFromLinks : List Link -> List Topic
topicsFromLinks links =
    links
        |> List.map .topics
        |> List.concat
        |> uniqueBy toString