小编Dan*_*iel的帖子

OPENXML与OPENROWSET和xml数据类型

为什么要使用OPENXML而不是OPENROWSET(BULK'file',SINGLE_BLOB)并转换为xml数据类型?

xml sql-server

5
推荐指数
1
解决办法
1760
查看次数

完整,高效的NumericLiteral模块实现

基于这个问题的讨论,任何人都可以提供代码或代码链接,显示NumericLiteralX模块的完整实现(例如这个)吗?我特别感兴趣的是有效实现FromInt32/ 64用于NumericLiteralX促进通用数字运算的模块.这是从上述问题中得出的可能效率低下的实现:

module NumericLiteralG = 
    let inline FromZero() = LanguagePrimitives.GenericZero
    let inline FromOne() = LanguagePrimitives.GenericOne
    let inline FromInt32 (n:int) =
        let one : ^a = FromOne()
        let zero : ^a = FromZero()
        let n_incr = if n > 0 then 1 else -1
        let g_incr = if n > 0 then one else (zero - one)
        let rec loop i g = 
            if i = n then g
            else …
Run Code Online (Sandbox Code Playgroud)

generics f# literals

5
推荐指数
1
解决办法
612
查看次数

异常类型可以是通用的吗?

我尝试了以下,但不起作用.

exception MyError<'a> of 'a
exception 'a MyError of 'a
Run Code Online (Sandbox Code Playgroud)

我必须使用长形式:

type MyError<'a>(value) =
  inherit System.Exception()
  member this.Value : 'a = value
Run Code Online (Sandbox Code Playgroud)

generics f# exception

5
推荐指数
1
解决办法
213
查看次数

AutoOpen外部定义的模块

有没有办法自动打开外部定义的模块?我希望它可以在整个项目中使用而无需在每个文件中打开它.这样的事情是理想的:

[<AutoOpen>]
module MyModule = YourNamespace.YourModule //ERROR: Ignoring attributes on module abbreviation
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个,它(假设)将外部定义的模块作为新模块的公共接口的一部分.

module MyModule = 
  module public YourModule = YourNamespace.YourModule //ERROR: Ignoring accessibility attribute on module abbreviation. Module abbreviations are always private.
Run Code Online (Sandbox Code Playgroud)

f# module

5
推荐指数
1
解决办法
271
查看次数

在活动模式中使用typeof <_>

鉴于以下设计的活跃模式:

let (|TypeDef|_|) (typeDef:Type) (value:obj) =
  if obj.ReferenceEquals(value, null) then None
  else
    let typ = value.GetType()
    if typ.IsGenericType && typ.GetGenericTypeDefinition() = typeDef then Some(typ.GetGenericArguments())
    else None
Run Code Online (Sandbox Code Playgroud)

下列:

let dict = System.Collections.Generic.Dictionary<string,obj>()
match dict with
| TypeDef typedefof<Dictionary<_,_>> typeArgs -> printfn "%A" typeArgs
| _ -> ()
Run Code Online (Sandbox Code Playgroud)

给出错误:

模式匹配中的意外类型应用程序.预期' - >'或其他令牌.

但这有效:

let typ = typedefof<Dictionary<_,_>>
match dict with
| TypeDef typ typeArgs -> printfn "%A" typeArgs
| _ -> ()
Run Code Online (Sandbox Code Playgroud)

为什么typedefof(或typeof)不允许在这里?

f# active-pattern

5
推荐指数
2
解决办法
1053
查看次数

如何获取CRTP类型的泛型类型定义

在C#中给出以下CRTP类型:

public abstract class DataProviderBase<TProvider>
    where TProvider : DataProviderBase<TProvider> { }
Run Code Online (Sandbox Code Playgroud)

我如何在F#中获得其泛型类型定义?

let typeDef = typedefof<DataProviderBase<_>>
Run Code Online (Sandbox Code Playgroud)

产生错误:

对类型推断变量应用默认类型"DataProviderBase <'a>"时,键入约束不匹配.统一''a'和'DataProviderBase <'时,结果类型将是无限的'a>考虑添加更多类型约束

在C#中,它将是:

var typeDef = typeof(DataProviderBase<>);
Run Code Online (Sandbox Code Playgroud)

UPDATE

我找到了一个解决方法:

[<AbstractClass>]
type DummyProvider() =
  inherit DataProviderBase<DummyProvider>()

let typeDef = typeof<DummyProvider>.BaseType.GetGenericTypeDefinition()
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点,没有额外的类型?

reflection f# crtp

5
推荐指数
1
解决办法
577
查看次数

使用反射创建Action <'T>的实例

我如何创建Action<'T>使用反射的实例?这就是我所拥有的:

let makeAction (typ:Type) (f:'T -> unit) = 
  let actionType = typedefof<Action<_>>.MakeGenericType(typ)
  let converter = FSharpFunc.ToConverter(f)
  Delegate.CreateDelegate(actionType, converter.Method)
Run Code Online (Sandbox Code Playgroud)

哪个barf:

System.ArgumentException:绑定到目标方法时出错.
在System.Delegate.CreateDelegate(Type type,MethodInfo方法,Boolean throwOnBindFailure)

'T是一个typ实现的接口.

reflection f# delegates

5
推荐指数
1
解决办法
779
查看次数

F#中的数组协方差

由于.NET数组是协变的,因此以下代码可在C#中工作:

var strArray = new string[0];
object[] objArray = strArray;
Run Code Online (Sandbox Code Playgroud)

在F#中,给定数组,'T[]将其转换为的最佳方法是什么obj[],而无需重新创建数组(例如Array.map box)?我正在使用(box >> unbox),但感觉很草率。

.net arrays f# covariance

5
推荐指数
2
解决办法
1115
查看次数

使用FParsec解析日期和时间

在一个简单的查询语言中,我想识别日期和时间文字,最好不使用分隔符.例如,

CreationDate = 2013-05-13 5:30 PM
Run Code Online (Sandbox Code Playgroud)

我可以使用组合器来检测基本语法(例如yyyy-MM-dd hh:mm tt),但是需要将其传递给DateTime.TryParse完全验证.

几个问题:

  • 是否存在用于"后处理"解析器结果的组合器,例如, pstring "1/2/2000" |> (fun s -> try OK(DateTime.Parse s) with _ -> Fail("not a date"))
  • 是否有可能谓词应用于字符串(如satisfy不来char)?
  • 是否有更好的方法来解析日期/时间?

UPDATE

使用Guvante和Stephan的例子,我想出了这个:

let dateTimeLiteral =
  let date sep = pipe5 pint32 sep pint32 sep pint32 (fun a _ b _ c -> a, b, c)
  let time = 
    (pint32 .>>. (skipChar ':' >>. pint32)) .>>. 
      (opt (stringCIReturn " am" false <|> stringCIReturn " pm" …
Run Code Online (Sandbox Code Playgroud)

f# datetime parsing fparsec

5
推荐指数
1
解决办法
431
查看次数

v3.1中编译的联合字段的编译形式

首先,F#3.1规格是否可在线获取?如果是这样,那么答案应该很容易找到.

我不知道是否与识别联合的编译形式命名字段(在3.1加)将包括与字段的名称属性,而不是通常的Item1,Item2...性质.

f# discriminated-union f#-3.1

5
推荐指数
1
解决办法
240
查看次数