当编译器错误地假设类型应该是所有字符串时,如何对具有不同类型的记录列表进行排序?

时间:2017-02-18 19:35:44

标签: elm

我有一个辅助函数,可以用6种不同的方式对记录列表进行排序。

sortResults : SortableField -> SortOrder -> List RecsysResult -> List RecsysResult
sortResults sortOnField sortOrder results =
    let
        reverse =
            case sortOrder of
                TypeAlias.ASC ->
                    False

                TypeAlias.DESC ->
                    True

        field =
            case sortOnField of
                TypeAlias.MHID ->
                    .mhid

                TypeAlias.NAME ->
                    .name

                TypeAlias.SCORE ->
                    .score

        sortedResults =
            List.sortBy field results

        newResults =
            if reverse then
                List.reverse sortedResults
            else
                sortedResults
    in
        newResults

即使没有调用所述函数,编译器也会给我一个错误。

  

函数sortBy的第二个参数导致不匹配。

     

42 | List.sortBy字段结果                                     ^^^^^^^函数sortBy期望第二个参数为:

List { mhid : String, name : String, score : String }
     

但它是:

List RecsysResult
     

提示:score字段中的问题。

RecsysResult只是记录的类型别名

type alias RecsysResult =                                                             
    { name : Name, mhid : Mhid, score : Score }

NameMhid只是字符串的类型别名,而Score是Float的类型别名。

所以基本上编译器需要一个{ name : String, mhid : String, score : String }列表,但我正在使用{ name : String, mhid : String, score : Float }

1 个答案:

答案 0 :(得分:4)

field在所有分支(... -> String... -> Float)中都有不同的类型,因此Elm将其替换为... -> String

    newList =
        case sortOnField of
            TypeAlias.MHID ->
                List.sortBy .mhid results

            TypeAlias.NAME ->
                List.sortBy .name results

            TypeAlias.SCORE ->
                List.sortBy .score results