gpt4 book ai didi

elm - `Cmd msg` 是什么意思?

转载 作者:行者123 更新时间:2023-12-04 19:20:37 25 4
gpt4 key购买 nike

我正在尝试使用端口将 URL 传递给 Javascript,以便将用户重定向到另一个页面。我写了一个port module包含我的项目所需的所有端口:

port module Utils exposing (..)
port changePage : String -> Cmd Event

然后,我将它导入到我的 Elm 文件中:

type Event = PageChange String
import Utils exposing (changePage)

但是编译器不喜欢它:
It looks like the keyword `import` is being used as a variable.
8| import Utils exposing (changePage)
^
Rename it to something else.

所以我将端口定义移动到主文件:

type Event = PageChange String
port changePage : String -> Cmd Event

但编译器仍然不同意:
Port `changePage` has an invalid type.
28| port changePage : String -> Cmd Event
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You are saying it should be:
String -> Platform.Cmd.Cmd BmC.Index.Event
But you need to use the particular format described here:
<http://guide.elm-lang.org/interop/javascript.html#ports>

所以我去看了那个特殊的格式, port check : String -> Cmd msg .我不明白那个 msg来自,所以我去查看 code ,我还是不明白那条线是什么意思。
msg 在哪里来自? type Cmd msg = Cmd 是什么意思意思是?提前致谢。

最佳答案

import语句必须出现在任何函数或类型定义之前。这就是您在此代码上遇到编译错误的原因:

type Event = PageChange String
import Utils exposing (changePage)

关于端口的问题:Elm 的端口是架构边缘的一项功能。它们允许与不同的语言进行互操作,因此无论出于何种意图和目的,幕后都在发生着一些神奇的事情。

其他语言具有与其他语言互操作的类似“神奇”构造。 Haskell 有 Foreign Function Interface (FFI)而 C# 有 extern关键字来调用外部库。
Cmd的定义是那些通过查看代码并没有真正意义的部分之一。

type Cmd msg = Cmd

这并不能告诉我们太多,但没关系。它更像是编译器在编译时填充的占位符。其他语言也这样做。 Haskell often uses a bottom call of let x = x in x 表示编译器将实际实现的函数。

因此,除非您对 Elm 和 Javascript 之间的交叉实现真正感兴趣,否则可以将其留给想象并接受魔法。

至于能够在您的端口中指定具体类型,那只是编译器团队的另一种选择。即使是 Cmd Event是唯一可以通过端口的东西,他们选择强制泛型类型作为 Cmd 的类型参数。 Cmd msg 的准确拼写不是必需的。 msg可以是任何小写字母:

port check : String -> Cmd a

关于elm - `Cmd msg` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41307065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com