使用以下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) 不确定我是否正确或者是否有更好的方法或现有的库已经解决了这个问题.
特别是我不确定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) 有没有办法在Visual Studio 2013中禁用Web发布活动窗口?
我找不到任何禁用该功能的选项.
写这样的东西有区别吗:
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)
谢谢!
从
#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的端点解决了问题,但我甚至不知道我是否可能最终需要其他端点.
如果我知道两个集合中的一个将比另一个更大,是否有任何推荐的方法来调用Set.union?
Set.union large small
Run Code Online (Sandbox Code Playgroud)
要么
Set.union small large
Run Code Online (Sandbox Code Playgroud)
谢谢
我写了这个小小的网络监听器模拟:
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)
或者诸如此类的.
谢谢!
我注意到 Mailbox 类型是封装的,只能通过使用 MailboxProcessor 来使用。
这意味着要拥有一个可以向其发布消息的代理,我必须拥有一个单一类型的邮箱(或以奇特的方式使用现有的 MailboxProcessor)。
我是否应该理解为单个工作流程设置多个邮箱本质上会导致糟糕的设计?Ccr 显然为您提供了这种程度的自由。
编辑:正如丹尼尔指出的那样,如果一个人想发送多种消息类型,DUs 优雅地解决了这个问题——而且我过去也没有这样做过。
但问题是,这样做是不是一种代码味道?随着时间的推移,添加更多类型的发送给代理的消息会不会导致您承担太多责任?我有时认为始终将代理使用的消息类型封装在接口后面很重要,这样这些信息就不会公开。