TYPE MISMATCH-此函数无法处理通过(|>)管道发送的参数:

时间:2019-07-18 08:15:37

标签: elm

我是一位超级榆树的初学者,正在尝试制作应用。 目前,我正在努力向服务器发送登录页面和http请求。 但是,我被困在这里...

我下面有类似init的函数。

init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
init flags url key =
    Model key TopPage
        |> goTo (Route.parse url)

我的模型的定义如下。

-- MODEL


type alias Model =
    { key : Nav.Key
    , page : Page
    , name : String
    , tags : List Tag
    , jwt : String }

,下面是goTo函数。

goTo : Maybe Route -> Model -> ( Model, Cmd Msg )
goTo maybeRoute model =
    case maybeRoute of
        Nothing ->
            ( { model | page = NotFound }, Cmd.none )

        Just Route.Top ->
            ( { model | page = TopPage }, Cmd.none )
...

路由类型在下面。

type Route
    = Top
    | User String
    | Repo String String


parse : Url -> Maybe Route
parse url =
    Url.Parser.parse parser url


parser : Parser (Route -> a) a
parser =
    oneOf
        [ map Top top
        , map User string
        , map Repo (string </> string)
        ]

但发生以下错误。

-- TYPE MISMATCH -------------------------------------------------- src/Main.elm

This function cannot handle the argument sent through the (|>) pipe:

54|     Model key TopPage
55|         |> goTo (Route.parse url)
               ^^^^^^^^^^^^^^^^^^^^^
The argument is:

    String -> List Tag -> String -> Model

But (|>) is piping it a function that expects:

    Model

我在这里犯了什么错误?....

2 个答案:

答案 0 :(得分:2)

您的Model类型有五个字段,但在行

    Model key TopPage

您仅提供五个中前两个的值。您缺少nametagsjwt字段的值。提供这些值,问题应该消失。

当您声明类型别名(例如Model)时,Elm将创建一个构造函数,也称为Model。 Elm函数支持部分应用程序,因为如果您为某些但不是所有参数传递值,则最终会得到一个接受其余值的函数。您提供了两个参数,所以最终得到一个带有三个参数并返回Model的函数。

答案 1 :(得分:1)

有两种建立类型值的方法。给出一个Person类型别名的简单示例:

type alias Person = { name : String, age : Int }

您可以通过指定所有字段来构造一个值(请注意,您不必在构造函数中指定Person; Elm的编译器足够聪明,可以通过其形状来知道它)

jane : Person
jane = { name = "Jane", age = 35 }

或者您可以使用类型名称来构建值,并按照定义它们的顺序指定每个字段的值。通过这种样式,您可以想到Person就像一个具有两个参数的函数,它们返回一个Person值。

jane : Person
jane = Person "Jane" 35

在每种情况下,都必须在构造类型时指定该类型的 all 字段,以获取完整的Person值。但是,这还不是全部。构造Person时可以省略age参数,但结果不是Person,它是一个使用age并返回Person的函数。换句话说,

janeAged : Int -> Person
janeAged = Person "Jane"

您可以从尾部剥离尽可能多的参数,甚至可以剥离所有参数:

somebody : String -> Int -> Person
somebody = Person

回到您的示例。您仅通过指定两个参数(Model)来构造Model key TopPage值。该表达式的值不会产生Model,而是会产生一个需要三个以上参数来创建Model的函数。这就是为什么错误消息指示您需要三个参数来构建模型的原因。

创建Model时需要指定其所有值。