我不清楚如何从列表中检索不同的项目.
我有以下代码:
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说它总是返回:Run Code Online (Sandbox Code Playgroud)List Topic但是返回的值(如上所示)是:
Run Code Online (Sandbox Code Playgroud)List comparable
我希望以下几行能够在结构平等方面发挥作用:
|> 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)
根据以下文件Set:
值可以是任何类似的类型.这包括Int,Float,Time,Char,String和元组或类似类型的列表.
您试图将Topic值放在只有可比类型才能起作用的位置.
值得庆幸的是,有一个elm-community/list-extra包暴露了一个uniqueBy函数,它允许你指定自己的函数来将某些东西变成一个可比的东西.
如果您想获得不同的主题列表,并在name和isFeatured字段上进行匹配,那么您可以使用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)