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具有已填充的订阅服务器列表时,编译器将失败。