这是声明不可变结构的正确方法吗?
public struct Pair
{
public readonly int x;
public readonly int y;
// Constructor and stuff
}
Run Code Online (Sandbox Code Playgroud)
我想不出为什么这会遇到问题,但我只想问一下.
在这个例子中,我使用了int.如果我使用了一个类,但该类也是不可变的,就像这样呢?这应该也可以正常工作,对吧?
public struct Pair
{
public readonly (immutableClass) x;
public readonly (immutableClass) y;
// Constructor and stuff
}
Run Code Online (Sandbox Code Playgroud)
(旁白:据我所知,使用性能更加普及,并允许改变,但这种结构的目的是从字面上只存储两个值我在永恒的问题只是有兴趣在这里.)
假设我希望获得额外的类型检查,以便在语义上处理不同的原语:
public struct Apple
{
readonly int value;
// Add constructor + operator overloads
}
public struct Orange
{
readonly int value;
// Add constructor + operator overloads
}
Run Code Online (Sandbox Code Playgroud)
关键是我们无法比较"苹果与橙子",因此在结构中包含实际的int意味着我们可以通过代码获得类型检查和一些额外的可读性和文档.
我的问题是:在内存和速度方面,与此相关的开销是多少?由于结构是值类型,包含这些结构的变量是32位还是更大?使用这些结构而不是基元的性能开销如何 - 运算符重载会产生很大的开销吗?
关于这样做的智慧的任何其他建议?
我有一个普遍的问题和一个更具体的案例问题.
一般来说,如何组合不同的monad?monad运算符的某些组合是否允许轻松组合?或者是否必须编写特殊方法来组合每对可能的monad?
作为一个具体的例子,我写了一个Maybe monad.如何使用IEnumerable<IMaybe<T>>?除了手动挖掘LINQ扩展中的Maybe monad(例如:if(maybe.HasValue)...... select子句中)之外,是否有一种"monadic"方式将两者与各自的Bind等monad操作相结合?
否则,如果我必须编写特定的组合方法,这是正确的方法吗?
public static IEnumerable<B> SelectMany<A, B>(this IEnumerable<A> sequence, Func<A, IMaybe<B>> func)
{
return from item in sequence
let result = func(item)
where result.HasValue
select result.Value;
}
public static IEnumerable<C> SelectMany<A, B, C>(this IEnumerable<A> sequence, Func<A, IMaybe<B>> func, Func<A, B, C> selector)
{
return from item in sequence
let value = item
let maybe = func(item)
where maybe.HasValue
select selector(value, maybe.Value);
}
Run Code Online (Sandbox Code Playgroud)