为什么要使用OPENXML而不是OPENROWSET(BULK'file',SINGLE_BLOB)并转换为xml数据类型?
基于这个问题的讨论,任何人都可以提供代码或代码链接,显示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) 我尝试了以下,但不起作用.
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) 有没有办法自动打开外部定义的模块?我希望它可以在整个项目中使用而无需在每个文件中打开它.这样的事情是理想的:
[<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) 鉴于以下设计的活跃模式:
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)不允许在这里?
在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)
我找到了一个解决方法:
[<AbstractClass>]
type DummyProvider() =
inherit DataProviderBase<DummyProvider>()
let typeDef = typeof<DummyProvider>.BaseType.GetGenericTypeDefinition()
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以做到这一点,没有额外的类型?
我如何创建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实现的接口.
由于.NET数组是协变的,因此以下代码可在C#中工作:
var strArray = new string[0];
object[] objArray = strArray;
Run Code Online (Sandbox Code Playgroud)
在F#中,给定数组,'T[]将其转换为的最佳方法是什么obj[],而无需重新创建数组(例如Array.map box)?我正在使用(box >> unbox),但感觉很草率。
在一个简单的查询语言中,我想识别日期和时间文字,最好不使用分隔符.例如,
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)?使用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#3.1规格是否可在线获取?如果是这样,那么答案应该很容易找到.
我不知道是否与识别联合的编译形式命名字段(在3.1加)将包括与字段的名称属性,而不是通常的Item1,Item2...性质.