小编Eri*_*son的帖子

类型没有null作为适当的值

对于示例程序:

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#

24
推荐指数
2
解决办法
6393
查看次数

如何避免多次迭代作为模式?

在函数式语言中(使用F#),我正在努力在功能组合的优点与单一责任之间找到平衡,并在序列上获得单次迭代的性能.实现两者的任何代码模式建议/示例?

我没有扎实的计算理论背景,我一遍又一遍地遇到这种一般模式:迭代一个集合,想要在迭代时做副作用,以避免在同一个集合或其结果集上进一步迭代.

一个典型的例子是"减少"或"过滤"功能:过滤时有很多次我希望根据过滤器的结果采取额外的步骤,但我想避免过滤结果的第二次枚举.

我们将输入验证作为一个简单的问题陈述:

  1. 命名输入数组
  2. 管道传输到"isValid"功能过滤器
  3. 副作用:记录无效的输入名称
  4. 管道有效输入以进一步执行

问题示例

在F#中,我可能最初写道:

inputs
// how to log invalid or other side-effects without messing up isValid??
|> Seq.filter isValid
|> execution
Run Code Online (Sandbox Code Playgroud)

解决方案示例#1

有了内联副作用,我需要这样的东西:

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)

解决方案示例#2

我可以使用元组进行更纯粹的关注点分离,但需要第二次迭代:

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)

theory f# functional-programming

4
推荐指数
1
解决办法
237
查看次数

如何制作一个所有实现通用界面的类型安全包?

需要一个类型安全的项目包,所有项目都实现了通用接口.

希望做的事情如下:

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)

.net generics

2
推荐指数
1
解决办法
299
查看次数

创建新线程时,Web API"ApiController"是否从ASP.NET线程池中窃取线程?

据我了解,MVC AsyncController专门介绍了在创建新线程时避免从ASP.NET线程池中窃取线程的问题.新的Web API没有类似的东西AsyncApiController.它的继承/实现签名ApiControllerControllerAsyncController.

问题: Web API是否已经处理了在创建新线程时避免从ASP.NET线程池中窃取线程的问题?我错过了一些新的自动处理这个的东西吗?

以供参考:

c# asp.net-mvc asynchronous asp.net-web-api

0
推荐指数
1
解决办法
3418
查看次数