小编Los*_*ion的帖子

公共类型在F#中实现内部接口时的可访问性编译错误

我写了一些代码

type internal IMyInterface =
    abstract member Method1 : unit -> unit

type Class1() = 

    member this.Y() =
        (this :> IMyInterface).Method1()

    interface IMyInterface with
        member this.Method1() = ()
Run Code Online (Sandbox Code Playgroud)

请注意,公共类型Class1实现了一个内部接口IMyInterface,它编译得很好.在生成的MSIL中,"Method1"显示为私有.这类似于C#中的显式接口.

但是,当我将代码更改为

type internal Foo() =
    member x.Value = "Foo"

type internal IMyInterface =
    abstract member Method1 : Foo -> unit

type Class1() = 

    member this.Y() =
        let v = Foo()
        (this :> IMyInterface).Method1(v)

    interface IMyInterface with
        member this.Method1(v : Foo) = ()
Run Code Online (Sandbox Code Playgroud)

这种类型的接口方法"Method1"采用内部类型"Foo"作为参数.这次,它不会编译错误

The type 'Foo' is less accessible than the …
Run Code Online (Sandbox Code Playgroud)

f#

24
推荐指数
1
解决办法
302
查看次数

如何在F#中有条件地包装sprintf?

我读过一个类似的问题:Magic sprintf函数 - 如何包装它?,但我的要求有点不同,所以我想知道它是否可行.

首先,我想稍微解释一下这个场景,我目前有跟踪功能一样

let Trace traceLevel ( fs : unit -> string) =
    if traceLevel <= Config.TraceLevel then
        Trace.WriteLine <| fs()
Run Code Online (Sandbox Code Playgroud)

因此,仅当traceLevel小于或等于Config.TraceLevel指定的跟踪级别时,才会调用函数"fs"来生成字符串.因此,当traceLevel大于Config.TraceLevel时,它是一个无操作."fs"根本没有评估.

虽然不限于此,但在实践中,几乎所有用例都是如此

Trace 4 (fun _ -> sprintf "%s : %i"  "abc" 1)
Run Code Online (Sandbox Code Playgroud)

总是写"fun _ - > sprintf"部分是相当繁琐的.理想情况下,提供用户可以写的风味会很好

Trace 4 "%s : %i" "abc" 1
Run Code Online (Sandbox Code Playgroud)

它可以

  • 获取sprintf提供的格式/参数检查.
  • 具有与采用lambda"fs"的原始跟踪函数相同的性能行为.这意味着如果跟踪级别的检查返回false,则它本质上是一个无操作.不需要支付额外费用(例如字符串格式等)

在阅读了原始SO问题的答案后,我无法想象如何实现这一点.

似乎kprintf允许对格式化的字符串调用continuation函数.包装器仍然返回一个printf函数返回的函数(然后它可以是一个带有一个或多个参数的函数).因此,currying可以发挥作用.但是,在上面的情况中,需要的是在格式化字符串之前评估条件,然后将格式化的字符串应用于Trace.WriteLine.似乎现有的Printf模块具有允许注入前置条件评估的API.因此,通过包装现有API似乎不容易实现.

有关如何实现这一点的任何想法?(我非常简短地阅读了FSharp.Core/printf.fs,似乎可以通过提供新的派生PrintfEnv来实现.但是,这些是内部类型).

更新

感谢Tomas和Lincoln的答案.我认为这两种方法都会受到一些影响.我用fsi在我的机器上进行了一些简单的测量.

选项1:我的原始方法,在"假"路径上,"fs()"根本没有被评估.用法不太好,因为需要编写"fun _ - > sprintf"部分.

let trace1 lvl (fs : unit -> string) =
    if lvl …
Run Code Online (Sandbox Code Playgroud)

f#

6
推荐指数
1
解决办法
421
查看次数

如何创建基于.Net的Azure云服务的x64(而不是AnyCPU)构建?

我正在使用Azure 2.7.

我创建了一个只包含一个辅助角色的C#云服务.完成后,解决方案包含

  • 一个ccproj
  • 一个csproj

两者都使用AnyCPU的设置.

然后我将PropertyGroup"Debug | x64"和"Release | x64"添加到两个项目中.还将默认值更改为x64.结果,一个x64构建.

但是,每当我在"ccproj"上选择"发布"时,我注意到它总是构建AnyCPU而不是x64.我找不到如何强制它来构建x64以进行打包和部署.

然后我再次编辑了两个proj文件,并删除了"Debug | AnyCPU"和"Release | AnyCPU"的PropertyGroup.在我这样做之后,当我再次尝试构建x64时,我收到错误:

C:\ Program Files(x86)\ MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(723,5):错误:未为项目"AzureWorkerRoleExample.ccproj"设置OutputPath属性.请检查以确保您为此项目指定了Configuration和Platform的有效组合.Configuration ='Release'Blatform ='AnyCPU'.如果某个其他项目正在尝试遵循项目到项目对此项目的引用,此项目已卸载或未包含在解决方案中,并且引用项目不使用相同或等效项目构建,则也可能出现此错误配置或平台.

我无法弄清楚如何解决这个错误.

有关如何强制VS制作x64构建的云服务并进行部署的任何想法?

我找到的一个解决方法是:保留AnyCPU属性组,但也放

<PlatformTarget>x64</PlatformTarget>

在小组中.因此,AnyCPU程序集实际上是针对x64的.但这听起来很糟糕.

任何的想法?

非常感谢!

azure

6
推荐指数
0
解决办法
542
查看次数

在Spark的客户端模式下,驱动程序需要网络访问远程执行程序吗?

在客户端模式下使用spark (例如yarn-client)时,运行驱动程序的本地计算机是否直接与运行远程执行程序的集群工作程序节点通信?

如果是,是否意味着机器(运行驱动程序)需要具有对工作节点的网络访问权限?因此主节点从集群请求资源,并将工作节点的IP地址/端口返回给驱动程序,因此驱动程序可以启动与工作节点的通信?

如果没有,客户端模式如何实际工作?

如果是,是否意味着如果以工作节点在群集外部不可见的方式配置群集,则客户端模式将不起作用,并且必须使用群集模式?

谢谢!

hadoop-yarn apache-spark

4
推荐指数
2
解决办法
1254
查看次数

标签 统计

f# ×2

apache-spark ×1

azure ×1

hadoop-yarn ×1