我写了这个F#函数来将列表分区到某一点而不是更进一步 - 很像是takeWhile和之间的交叉partition.
let partitionWhile c l =
let rec aux accl accr =
match accr with
| [] -> (accl, [])
| h::t ->
if c h then
aux (h::accl) t
else
(accl, accr)
aux [] l
Run Code Online (Sandbox Code Playgroud)
唯一的问题是"采取"的项目是相反的:
> partitionWhile ((>=) 5) [1..10];;
val it : int list * int list = ([5; 4; 3; 2; 1], [6; 7; 8; 9; 10])
Run Code Online (Sandbox Code Playgroud)
除了诉诸调用之外rev,是否有一种方法可以编写这个函数,使第一个列表的顺序正确?
在功能样式中实现对象模型是否切实可行?
OOP似乎擅长的一个问题是描述对象模型.
例如,HTML DOM是一种复杂的,有状态的野兽,它直接与UI接口,需要动态语言的可编程性.OOP功能往往在很多方面都有用:
如果你通过MVVM投射模型,故事的UI方面可能有点没有实际意义,但你仍然在不断地与国内内部进行斗争.
我在这个项目的F#工作,所以我可以轻松地使用OOP,但我很好奇我能在多大程度上推动它变得不切实际.是否有设计模式或任何东西?
假设我有这个课程:
type Pet (name:string) as this =
let mutable age = 5
let mutable animal = "dog"
Run Code Online (Sandbox Code Playgroud)
我希望能够Pet基于一些序列化数据创建一个新的,我用这个记录表示:
type PetData = {
name : string
age : int
animal : string
}
Run Code Online (Sandbox Code Playgroud)
(TLDR:我无法弄清楚构建一个构造函数的语法,它将PetData填充let绑定.我的各种尝试都会随之而来.)
所以我创建了一个新的Pet构造函数,它将为let绑定赋值.我尝试使用类初始化器语法:
new (data:PetData) =
Pet(name,
age = data.age,
animal = data.animal
)
Run Code Online (Sandbox Code Playgroud)
嗯,不, No accessible member or object constructor named 'Pet' takes 1 arguments. The named argument 'age' doesn't correspond to any argument or settable return property for any overload.
我检查以确保我已经掌握了所有语法:没有错过的逗号,正确的"赋值"( …
我编写了一个函数,用于从文件中加载字节并返回包含字节缓冲区和缓冲区长度的FileData结构.
我希望缓冲区一旦被消耗并被抛出范围就被删除.
由于各种播放错误,我无法编译它.此外,我不确定缓冲区是否正确移动而不是复制.我不介意FileData结构本身被复制,因为它最多可能是16个字节.
一般来说,如何将智能指针用作类/结构域?这甚至是你做的事情吗?
我知道这是一个模糊的问题,但由于我在智能指针方面存在一些概念上的困难,我希望这个例子能帮助我朝着正确的方向前进.
这是我到目前为止所得到的:
struct FileData
{
unique_ptr<char[]> buf;
unsigned int len;
};
FileData LoadFile(string filename)
{
ifstream str;
str.open(filename, ios::binary);
str.seekg(0, ios::end);
auto len = str.tellg();
str.seekg(0, ios::beg);
char* buf = new char[len];
str.read(buf, len);
str.close();
FileData d = { unique_ptr<char[]>(buf), len };
return d;
}
Run Code Online (Sandbox Code Playgroud)
编辑:由于有些人对我使用当前代码得到的错误消息感到好奇,这里是:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Run Code Online (Sandbox Code Playgroud) 我不知道我是否安装了错误的东西,但是制作了一个C#可移植类库目标.NET for Windows Store apps, .NET Framework 4.5, Silverlight 4 and higher, Windows Phone 7 and higher,我遇到的错误System.Tuple就是丢失了.
怎么会这样?
这个页面说"前缀运算符通常是右关联的,后缀运算符是左关联的"(强调我的).
是否存在左关联前缀运算符或右关联后缀运算符的实例?如果没有,假设的那个会是什么样子,怎么解析?
这是一个艰难的:
我正在开发一个大部分内容都是日语的网站。
但考虑这个网址:
http://www.stackoverflow.com/??/????URL?????
大多数 URL 解析器,包括 stackoverflow 的,不知道在哪里分隔包含日语的 URL。不好。
我还没有检查过其他浏览器,但谷歌浏览器会用日语显示 URL 解码的日语 URL——当你复制 URL 时,它会对其进行 URL 编码:
这是正确的做法,但并不是最友好的。所以,我想,我会让内容提供者只输入简短的英语 slug,就像这样:
http://www.stackoverflow.com/questions/what-to-do-with-japanese-urls
惊人的。但这有两个问题:
关于最佳行动方案的任何想法?:D
我想Thread.CurrentCulture根据一些路径数据设置值,但是在计算路径之后和调用action方法之前,我找不到挂钩到该触发器的事件.
有任何想法吗?
我想使用SetCursorPos将鼠标困在窗口中间(就像在 FPS 游戏中一样)。
问题是,当我这样做时,我的窗口会收到一个 WM_MOUSEMOVE——它充其量抵消了用户想要的任何移动,最坏的情况是进入反馈循环。
我考虑过使用 GetCursorPos 读取位置并忽略消息,如果它与我使用 SetCursorPos 移动它的位置相同。但是这种方法的问题在于鼠标是异步的。如果程序落后,那么 GetCursorPos 将返回一个与我预期不同的值——因此它不会知道忽略该消息。
有没有好的方法来处理这个问题?
当我在F#Interactive工作时,我经常想要对事件处理程序进行更改.简单地在事件上调用Subscribe或Add或AddHandler函数会导致旧事件继续被调用,这很少是意图.
一种解决方案是使用它返回的IDisposable,但这需要在您自己的代码中跟踪IDisposable,这对于探索性任务来说很麻烦.
当我Dictionary<IEvent,IDisposable>再次订阅同一个事件时,我试过调用Dispose():
let events = Dictionary<obj, IDisposable>()
let subonce (e:IEvent<'h,'e>) (handler: 'e -> unit) =
if events.ContainsKey e then
events.[e].Dispose()
events.Remove e |> ignore
let d = e.Subscribe handler
events.Add (e,d) |> ignore
let w = Window()
w.Show()
//Running this line in FSI a second time onward should Dispose() the previous subscription
subonce w.MouseUp (fun e -> printfn "%A" <| e.GetPosition(w))
Run Code Online (Sandbox Code Playgroud)
不幸的是,事实证明,F#生成了一个新的IEvent实例,因此天真地使用=或obj.Equals不切割它.
> w.MouseUp;;
val it : IEvent<Input.MouseButtonEventHandler,Input.MouseButtonEventArgs> =
<published event> {addHandler = …Run Code Online (Sandbox Code Playgroud) f# ×4
algorithm ×1
asp.net-mvc ×1
c# ×1
c++ ×1
c++11 ×1
clean-urls ×1
constructor ×1
list ×1
mousemove ×1
object-model ×1
parsing ×1
url ×1
urlencode ×1
visual-c++ ×1
winapi ×1
windows-8 ×1