我正在尝试创建一个自定义展开函数,返回其最后一个累加器值,如:
val unfold' : generator:('State -> ('T * 'State) option) -> state:'State -> 'T list * 'State
Run Code Online (Sandbox Code Playgroud)
我设法做了以下事情:
let unfold' generator state =
let rec loop resultList state =
match generator state with
| Some (value, state) -> loop (value :: resultList) state
| None -> (List.rev resultList), state
loop [] state
Run Code Online (Sandbox Code Playgroud)
但是我想避免List.rev
使用生成的列表并使用正确的顺序生成它.我想有必要使用continuation来构建列表,但我对函数式编程很陌生,并且还没有设法将我的思想包含在继续中; 我能想象的所有替代方案都会将累加器放在结果列表中,或者不允许函数返回它.
有办法做到这一点吗?
由于这是一个个人学习练习,我宁愿回答一个解释如何做,而不是简单地给出完整的代码.
我正在尝试将class
关键字用作命名空间中的函数标识符,例如:
namespace X {
export function class( ... ) { ... }
}
Run Code Online (Sandbox Code Playgroud)
命名空间本身正在扩展一个函数(function X ( ... ) { ... }
)。
有什么办法可以做到吗?
最近我开始了一个业余爱好项目来重写集合结构,首先删除非泛型,IEnumerator
并IEnumerable
创建新的IEnumerator/IEnumerable基接口.当我在新的可枚举界面和正常界面之间创建转换时,我很快就遇到了产量问题.
我IEnumerable<T>
和IEnumerator<T>
正常的一样,除了它们不从非通用的继承.为什么不能使用我的接口?foreach
可以使用我的界面.
例:
public static System.Collections.Generic.IEnumerable<T> ToMSEnumerable(this My.IEnumerable<T> enumerable)
{
foreach (var item in enumerable) // enumerating my enumerable works
{
yield return item; // this works
}
}
public static My.IEnumerable<T> ToMyEnumerable(this System.Collections.Generic.IEnumerable<T> enumerable)
{
foreach (var item in enumerable) // obviously work
{
yield return item; // this is where its not working.
// I haven't touched this in a few day, so I don't remember
// the …
Run Code Online (Sandbox Code Playgroud)