我是一位超级榆树的初学者,正在尝试制作应用。 目前,我正在努力向服务器发送登录页面和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
我在这里犯了什么错误?....
答案 0 :(得分:2)
您的Model
类型有五个字段,但在行
Model key TopPage
您仅提供五个中前两个的值。您缺少name
,tags
和jwt
字段的值。提供这些值,问题应该消失。
当您声明类型别名(例如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
时需要指定其所有值。