对于示例程序:
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let classFactory () = MyClass("up to you")
let live () =
let instance = classFactory()
if instance = null then raise(System.Exception("null is not living... that's why OO languages die from bugs"))
instance
Run Code Online (Sandbox Code Playgroud)
当我将此类用作隐式类型函数的返回值并将其与null(b/c兼容性要求与C#依赖注入)进行比较时,我得到错误"类型'MyClass'没有null作为正确的值" 我不能依赖F#选项类型).
我可以通过将null检查更改为:
if instance :> obj = null then
Run Code Online (Sandbox Code Playgroud)
但是,我知道("感觉")这完全是"错误的".特别是当我考虑MyClass如何是一个不需要盒装的引用类型时(从C#背景说起).
我已经读过"F#Value Restriction"以及它如何影响类型推断,但我似乎无法理解它如何应用于这种情况.
问:还有其他办法吗?
除了#1:我发现了一种更简单的方法来获取错误......
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let nullMyClass : MyClass = null
Run Code Online (Sandbox Code Playgroud)
除了#2:我确实尝试过System.Nullable而不考虑... MyClass是一个引用类型,而不是Nullable …
在函数式语言中(使用F#),我正在努力在功能组合的优点与单一责任之间找到平衡,并在序列上获得单次迭代的性能.实现两者的任何代码模式建议/示例?
我没有扎实的计算理论背景,我一遍又一遍地遇到这种一般模式:迭代一个集合,想要在迭代时做副作用,以避免在同一个集合或其结果集上进一步迭代.
一个典型的例子是"减少"或"过滤"功能:过滤时有很多次我希望根据过滤器的结果采取额外的步骤,但我想避免过滤结果的第二次枚举.
我们将输入验证作为一个简单的问题陈述:
在F#中,我可能最初写道:
inputs
// how to log invalid or other side-effects without messing up isValid??
|> Seq.filter isValid
|> execution
Run Code Online (Sandbox Code Playgroud)
有了内联副作用,我需要这样的东西:
inputs
|> Seq.filter (fun (name,value) ->
let valid = isValid (name,value)
// side-effect
if not valid then
printfn "Invalid argument %s" name
valid
|> execution
Run Code Online (Sandbox Code Playgroud)
我可以使用元组进行更纯粹的关注点分离,但需要第二次迭代:
let validationResults =
inputs
// initial iteration
|> Seq.filter (fun (name,value) ->
let valid = isValid (name,value)
(name,value,valid)
|> execution
// one example …Run Code Online (Sandbox Code Playgroud) 需要一个类型安全的项目包,所有项目都实现了通用接口.
希望做的事情如下:
var stringItem = new IItem<string>();
var numberItem = new IItem<int>();
var items = new List<IItem<T>>(); //T of course doesn't accomplish what I want
items.Add(stringItem);
items.Add(numberItem);
Run Code Online (Sandbox Code Playgroud)
就像是:
interface IItem
{
object Value { get; set; }
}
//Update: 2009-03-19 03:08 PM MST
//Added the following interface for clarity of my question
interface IItem<T> : IItem
{
new T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以:
var items = new List<IItem>();
Run Code Online (Sandbox Code Playgroud)
但是,我的包里丢失了安全性.所以,我想到了Dictionary:
var dict = new …Run Code Online (Sandbox Code Playgroud) 据我了解,MVC AsyncController专门介绍了在创建新线程时避免从ASP.NET线程池中窃取线程的问题.新的Web API没有类似的东西AsyncApiController.它的继承/实现签名ApiController也Controller和AsyncController.
问题: Web API是否已经处理了在创建新线程时避免从ASP.NET线程池中窃取线程的问题?我错过了一些新的自动处理这个的东西吗?
以供参考: