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

Sco*_*rod 3 elm

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

我有以下代码:

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

错误:

其定义topicsFromLinks与其类型注释不匹配.- 类型注释topicsFromLinks说它总是返回:

List Topic
Run Code Online (Sandbox Code Playgroud)

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

List comparable
Run Code Online (Sandbox Code Playgroud)

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

|> Set.fromList
|> Set.toList
Run Code Online (Sandbox Code Playgroud)

为什么我收到可比较的清单?

如何解决此编译错误?

附录:

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

type alias Link =
    {
    ...
    , topics : List Topic
    ...
    }
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 6

根据以下文件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
Run Code Online (Sandbox Code Playgroud)