Elm 如何初始化基于递归类型别名的值?

Elm 如何初始化基于递归类型别名的值?,elm,Elm,如何初始化基于递归类型别名的值 type alias ContentProvider = { profile : Profile , topics : List Topic , links : Links , subscribers : Subscribers } type Subscribers = Subscribers (List ContentProvider) 我尝试初始化该值失败: contentProvider1 : Conte

如何初始化基于递归类型别名的值

type alias ContentProvider =
    { profile : Profile
    , topics : List Topic
    , links : Links
    , subscribers : Subscribers
    }


type Subscribers
    = Subscribers (List ContentProvider)
我尝试初始化该值失败:

contentProvider1 : ContentProvider
contentProvider1 =
    ContentProvider profile1 topics contentProvider1Links (Subscribers [ contentProvider2, contentProvider3 ])
请注意,最后一个参数导致错误:

(Subscribers [ contentProvider2, contentProvider3 ])
contentProvider1是以一种隐秘的方式定义的, 导致无限循环以下定义直接依赖于 相互之间:

┌─────┐
│    contentProvider1
│     ↓
│    contentProvider2
│     ↓
│    contentProvider3
└─────┘
我指的是这个。然而,我不明白为什么我仍然得到一个编译器错误

附件:


contentProvider2和contentProvider3需要像前面所说的那样定义,但这里的问题不是相互递归的类型别名,而是。以下是一个简化的示例:

type alias ContentProvider =
    { profile : String
    , topics : List String
    , links : String
    , subscribers : Subscribers
    }

type Subscribers = 
    Subscribers (List ContentProvider)

contentProvider1 : ContentProvider
contentProvider1 =
    ContentProvider "profile" ["art", "science"] "test" (Subscribers [contentProvider2])

contentProvider2 : ContentProvider
contentProvider2 =
    ContentProvider "profile" ["art", "science"] "test" (Subscribers [])

contentProvider2和contentProvider3需要像前面所说的那样定义,但这里的问题不是相互递归的类型别名,而是。以下是一个简化的示例:

type alias ContentProvider =
    { profile : String
    , topics : List String
    , links : String
    , subscribers : Subscribers
    }

type Subscribers = 
    Subscribers (List ContentProvider)

contentProvider1 : ContentProvider
contentProvider1 =
    ContentProvider "profile" ["art", "science"] "test" (Subscribers [contentProvider2])

contentProvider2 : ContentProvider
contentProvider2 =
    ContentProvider "profile" ["art", "science"] "test" (Subscribers [])

您的代码在语法上是正确的,在Elm 0.18之前,它应该已经编译过了。但是,当您运行该程序时,您可能会遇到堆栈溢出、由于尾部调用递归优化而导致的无限循环或运行时异常

考虑运行时需要经历什么才能扩展contentProvider1:

展开contentProvider1,它引用contentProvider2 展开contentProvider2,它引用contentProvider1 展开contentProvider1,它引用contentProvider2 以此类推,直到永恒 您正在体验的是Elm的超级有用的编译器,它将您从根本无法工作的代码中解救出来。编写非停止函数仍然是可能的,但是Elm的编译器现在检查一些在运行时可能会崩溃的常见情况


.

您的代码在语法上是正确的,在Elm 0.18之前,它应该已经编译过了。但是,当您运行该程序时,您可能会遇到堆栈溢出、由于尾部调用递归优化而导致的无限循环或运行时异常

考虑运行时需要经历什么才能扩展contentProvider1:

展开contentProvider1,它引用contentProvider2 展开contentProvider2,它引用contentProvider1 展开contentProvider1,它引用contentProvider2 以此类推,直到永恒 您正在体验的是Elm的超级有用的编译器,它将您从根本无法工作的代码中解救出来。编写非停止函数仍然是可能的,但是Elm的编译器现在检查一些在运行时可能会崩溃的常见情况


.

contentProvider 1和contentProvider 2的定义是什么?不能用严格的不可变语言(如elm)表示自引用循环。@ChadGilbert I添加了contentProvider值的定义。我是埃尔姆的新手。但是,文档表明我的最新实现应该可以工作。ContentProvider1和ContentProvider2的定义是什么?不能用严格的不可变语言(如elm)表示自引用循环。@ChadGilbert I添加了contentProvider值的定义。我是埃尔姆的新手。但是,文档表明我的最新实现应该可以工作。谢谢Sean。但是当contentProvider2有一个已填充的订阅者列表时,编译器会失败。谢谢Sean。但是,当contentProvider2具有已填充的订阅服务器列表时,编译器将失败。