我在Scala开发方面还是个新手,但我发现Option[T]概念非常棒,特别是在使用Some和None与模式匹配时。目前我甚至在一个C#项目中进行了一定程度的实现,但由于没有模式匹配,所以并不太棒。
真正的问题是,这个对象背后的理论是什么?它是Scala专有的东西吗?函数式语言?我应该在哪里找到更多相关知识呢?
我在Scala开发方面还是个新手,但我发现Option[T]概念非常棒,特别是在使用Some和None与模式匹配时。目前我甚至在一个C#项目中进行了一定程度的实现,但由于没有模式匹配,所以并不太棒。
真正的问题是,这个对象背后的理论是什么?它是Scala专有的东西吗?函数式语言?我应该在哪里找到更多相关知识呢?
Fold
函数会处理本应进行模式匹配的任何内容。Select
编写,则应使用它而不是Fold
(它相当于模式匹配)。否则,假设代码没有副作用(因此可以进行等式推理),您实际上将重新实现现有代码。这适用于所有语言,而不仅仅是Scala或C#。using System;
using System.Collections;
using System.Collections.Generic;
namespace Example {
/// <summary>
/// An immutable list with a maximum length of 1.
/// </summary>
/// <typeparam name="A">The element type held by this homogenous structure.</typeparam>
/// <remarks>This data type is also used in place of a nullable type.</remarks>
public struct Option<A> : IEnumerable<A> {
private readonly bool e;
private readonly A a;
private Option(bool e, A a) {
this.e = e;
this.a = a;
}
public bool IsEmpty {
get {
return e;
}
}
public bool IsNotEmpty{
get {
return !e;
}
}
public X Fold<X>(Func<A, X> some, Func<X> empty) {
return IsEmpty ? empty() : some(a);
}
public void ForEach(Action<A> a) {
foreach(A x in this) {
a(x);
}
}
public Option<A> Where(Func<A, bool> p) {
var t = this;
return Fold(a => p(a) ? t : Empty, () => Empty);
}
public A ValueOr(Func<A> or) {
return IsEmpty ? or() : a;
}
public Option<A> OrElse(Func<Option<A>> o) {
return IsEmpty ? o() : this;
}
public bool All(Func<A, bool> f) {
return IsEmpty || f(a);
}
public bool Any(Func<A, bool> f) {
return !IsEmpty && f(a);
}
private A Value {
get {
if(e)
throw new Exception("Value on empty Option");
else
return a;
}
}
private class OptionEnumerator : IEnumerator<A> {
private bool z = true;
private readonly Option<A> o;
private Option<A> a;
internal OptionEnumerator(Option<A> o) {
this.o = o;
}
public void Dispose() {}
public void Reset() {
z = true;
}
public bool MoveNext() {
if(z) {
a = o;
z = false;
} else
a = Option<A>.Empty;
return !a.IsEmpty;
}
A IEnumerator<A>.Current {
get {
return o.Value;
}
}
public object Current {
get {
return o.Value;
}
}
}
private OptionEnumerator Enumerate() {
return new OptionEnumerator(this);
}
IEnumerator<A> IEnumerable<A>.GetEnumerator() {
return Enumerate();
}
IEnumerator IEnumerable.GetEnumerator() {
return Enumerate();
}
public static Option<A> Empty {
get {
return new Option<A>(true, default(A));
}
}
public static Option<A> Some(A t) {
return new Option<A>(false, t);
}
}
}
维基百科是你的好朋友:http://en.wikipedia.org/wiki/Option_type
不幸的是,它没有提供任何日期,但我敢打赌它的ML起源早于Haskell的Maybe
。