小编Dav*_*ier的帖子

StackOverflow在continuation monad中

使用以下continuation monad:

type ContinuationMonad() =
    member this.Bind (m, f) = fun c -> m (fun a -> f a c)
    member this.Return x = fun k -> k x

let cont = ContinuationMonad()
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以下给我一个堆栈溢出:

let map f xs =
    let rec map xs =
        cont {
            match xs with
            | [] -> return []
            | x :: xs ->
                let! xs = map xs
                return f x :: xs
        }
    map xs id;;

let q = [1..100000] |> map ((+) …
Run Code Online (Sandbox Code Playgroud)

monads f# computation-expression

10
推荐指数
1
解决办法
827
查看次数

在F#中实现记忆的时间

不确定我是否正确或者是否有更好的方法或现有的库已经解决了这个问题.

特别是我不确定CAS是否需要记忆围栏...我想不是更好,但要求更好.

我也尝试过一个代理和可变字典,但我的直觉是它会更慢,但是实现更复杂.

module CAS =
    open System.Threading

    let create (value: 'T) =
        let cell = ref value

        let get () = !cell

        let rec swap f =
            let before = get()
            let newValue = f before
            match Interlocked.CompareExchange<'T>(cell, newValue, before) with
            | result when obj.ReferenceEquals(before, result) ->
                newValue
            | _ ->
                swap f

        get, swap

module Memoization =
    let timeToLive milis f =
        let get, swap = CAS.create Map.empty

        let evict key =
            async {
                do! Async.Sleep milis
                swap …
Run Code Online (Sandbox Code Playgroud)

f#

7
推荐指数
1
解决办法
562
查看次数

VS2013禁用Web Publish Activity窗口

有没有办法在Visual Studio 2013中禁用Web发布活动窗口?

我找不到任何禁用该功能的选项.

visual-studio

7
推荐指数
1
解决办法
830
查看次数

F#异步 - 两个结构之间的差异

写这样的东西有区别吗:

MailboxProcessor.Start(fun inbox -> async {
    let rec loop bugs =
        let! msg = inbox.Receive()
        let res = //something
        loop res
    loop []})
Run Code Online (Sandbox Code Playgroud)

并写这样:

MailboxProcessor.Start(fun inbox ->
    let rec loop bugs = async {
        let! msg = inbox.Receive()
        let res = //something
        do! loop res }
    loop [])
Run Code Online (Sandbox Code Playgroud)

谢谢!

f# asynchronous

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

为什么WSDL类型提供程序不能消除歧义歧义?

#r "FSharp.Data.TypeProviders"
#r "System.ServiceModel"

open Microsoft.FSharp.Data.TypeProviders

[<Literal>]
let serviceAddress = "http://localhost/Microsoft/Dynamics/GP/eConnect/mex"

type Dynamics = WsdlService<serviceAddress>
type DynTypes = Dynamics.ServiceTypes.SimpleDataContextTypes
type Address = System.ServiceModel.EndpointAddress
Run Code Online (Sandbox Code Playgroud)

无论我做什么,WSDL类型提供程序都无法消除函数调用的歧义:

let svc: DynTypes.eConnectClient = Dynamics.GeteConnectServiceEndpoint()
let svc2 = (Dynamics.GeteConnectServiceEndpoint : unit -> DynTypes.eConnectClient)()
let svc3 = (Dynamics.GeteConnectServiceEndpoint : Address -> DynTypes.eConnectClient)(Address serviceAddress)
Run Code Online (Sandbox Code Playgroud)

它们都不起作用.

禁用其他端点并仅留下eConnectClient的端点解决了问题,但我甚至不知道我是否可能最终需要其他端点.

f# wsdl type-providers

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

F#Set.union参数顺序性能

如果我知道两个集合中的一个将比另一个更大,是否有任何推荐的方法来调用Set.union?

Set.union large small
Run Code Online (Sandbox Code Playgroud)

要么

Set.union small large
Run Code Online (Sandbox Code Playgroud)

谢谢

f#

3
推荐指数
1
解决办法
250
查看次数

F#异步处理

我写了这个小小的网络监听器模拟:

Agent.Start(fun (_ : MailboxProcessor<unit>) ->
        let listener = new HttpListener()
        listener.Prefixes.Add(addr)
        listener.Start()

        let rec respondOut() = async {
                let! context = Async.FromBeginEnd(listener.BeginGetContext, listener.EndGetContext)
                use s = context.Response.OutputStream
                let wr = new StreamWriter(s)
                use disp = { new IDisposable with
                                member x.Dispose() =
                                    printfn "Disposing..."
                                    wr.Dispose() }
                wr.Write("Test")
                return! respondOut()
            }

        respondOut()
    )
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在每个循环上没有调用Dispose?

作为一个附带问题,我正在做这一切,因为我想测试在Web服务中响应文本的正确行为.我不确定我是否应该这样做:

use s = Context.Response.OutputStream
use sw = new StreamWriter(s)
    sw.Write("test")
Run Code Online (Sandbox Code Playgroud)

要么

Context.Response.Write("Test")
Context.Response.End()
Run Code Online (Sandbox Code Playgroud)

或者诸如此类的.

谢谢!

f# asynchronous

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

F# 邮箱与邮箱处理器

我注意到 Mailbox 类型是封装的,只能通过使用 MailboxProcessor 来使用。

这意味着要拥有一个可以向其发布消息的代理,我必须拥有一个单一类型的邮箱(或以奇特的方式使用现有的 MailboxProcessor)。

我是否应该理解为单个工作流程设置多个邮箱本质上会导致糟糕的设计?Ccr 显然为您提供了这种程度的自由。

编辑:正如丹尼尔指出的那样,如果一个人想发送多种消息类型,DUs 优雅地解决了这个问题——而且我过去也没有这样做过。

但问题是,这样做是不是一种代码味道?随着时间的推移,添加更多类型的发送给代理的消息会不会导致您承担太多责任?我有时认为始终将代理使用的消息类型封装在接口后面很重要,这样这些信息就不会公开。

f# ccr

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