gpt4 book ai didi

elm - Elm 中的类型不匹配

转载 作者:行者123 更新时间:2023-12-03 03:31:01 25 4
gpt4 key购买 nike

我刚刚开始学习 Elm,并且在理解为什么将自定义类型传递到期望的方法时遇到类型不匹配的问题......好吧,我称之为部分类型注释.

这是我正在使用的代码:

import Graphics.Element exposing (show)
import Debug

type User =
User { username : String, followers : List User }

type Action = Follow

fromJust : Maybe a -> a
fromJust x = case x of
Just y -> y
Nothing -> Debug.crash "error: fromJust Nothing"

update : User
-> Action
-> { user | followers : List User }
-> { user | followers : List User }
update actor action user =
case action of
Follow -> { user | followers = user.followers ++ [actor] }

getUsers : List User
getUsers =
[
User { username = "UserA", followers = [] },
User { username = "UserB", followers = [] }
]

main =
let
users = getUsers
first = fromJust (List.head users)
last = fromJust (List.head (List.reverse users))
in
show (update first Follow last)

以及 elm-lang.org/try 的错误输出:

类型不匹配

函数update的第三个参数导致不匹配。

43|显示(先更新 关注最后)函数 update 期望第三个参数为:

{ a | followers : List User }

但事实是:

User

提示:我总是从左到右找出参数的类型。如果当我检查它时,参数是可以接受的,我认为它在后续中是“正确的”检查。所以问题实际上可能在于先前的论点如何与第三个。

<小时/>

如果我更改 update 的类型注释以期望 User,我会得到不同的类型不匹配,表示我应该将类型更改回来。 :困惑:

最佳答案

这是因为递归类型。 Elm 似乎对这些处理没有特别直观(无论如何对于 Haskeller 来说),并且您必须在那里放置一些显式的展开和包装才能使其全部工作。我假设编译器引导您定义您拥有的 User 类型,就像我开始使用它时一样。

这一切的结果是,您的示例中 User 类型的值不是记录,它们是将记录作为参数的数据构造函数。您必须对这些值进行模式匹配才能获取记录,并记住每当返回此类值时都包含构造函数。幸运的是,Elm 有良好的模式匹配支持,否则这将是可怕的。

因此,如果您将 update 函数更改为

update : User 
-> Action
-> User
-> User
update actor action (User user) =
case action of
Follow -> User { user | followers = user.followers ++ [actor] }

一切正常。请注意,参数现在都是 User 类型,并且 user 参数正在被解构,以便我们可以获取其中的记录。最后,使用 User 数据构造函数重建结果。

关于elm - Elm 中的类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35694453/

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