我最近在这里读到了一个关于静态和动态链接的问题,这让我想起了一些关于它的问题.从那篇文章中,我可以看到技术上的差异(直接包括目标文件内容而不仅仅是指向它),但我想更多地了解这样做的优点/缺点.
不久之前,我的一位朋友已经编程了好几年,他感到遗憾的是,C#没有静态链接,并说这是他未来版本最需要的功能.不幸的是,我是一个新手,并不真正理解这个说法.
感谢任何启示!
Intellisense很适合它的功能,但我经常发现自己渴望像Vim这样的编辑器完成"原始"文本.我似乎无法找到一个能够完成一个单词的工具 - 也许是在一个字符串中,任何地方 - 并让VS尝试为我完成它(基于我之前在当前缓冲区中键入的内容,或者在所有打开的文件中,或者它想要工作).
我错过了什么吗?(或者,如果有必要,是否有扩展来执行此操作?)看起来它实际上比Intellisense更容易实现,但它确实可以节省输入.
谢谢!
我们都喜欢do,而且我很好奇,如果这种替代语法在理论上可能在monad世界之外有用.如果是这样,它会简化哪些其他类型的计算?例如,为Applicative提供相同的东西是否有意义?
我正在研究F#中的Land of Lisp一书(是的,我很奇怪).对于他们的第一个示例文本冒险,他们使用全局变量变异,我想避免它.我的monad-fu很弱,所以现在我正在做这样丑陋的状态:
let pickUp player thing (objects: Map<Location, Thing list>) =
let objs = objects.[player.Location]
let attempt = objs |> List.partition (fun o -> o.Name = thing)
match attempt with
| [], _ -> "You cannot get that.", player, objs
| thing :: _, things ->
let player' = { player with Objects = thing :: player.Objects }
let msg = sprintf "You are now carrying %s %s" thing.Article thing.Name
msg, player', things
let player = { …Run Code Online (Sandbox Code Playgroud) 从我正在阅读的内容来看,它$被描述为"将一个函数应用于它的参数".但是,它似乎不像(apply ...)Lisp 那样工作,因为它是一个二元运算符,所以它看起来真的唯一有助于有时避免使用括号,foo $ bar quux而不是foo (bar quux).我明白了吗?后一种形式被认为是"坏风格"吗?
不久前,我问了一个关于$的问题,并得到了有用的答案 - 事实上,我以为我明白了如何使用它.
看来我错了:(
此示例显示在教程中:
instance Monad [] where
xs >>= f = concat . map f $ xs
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活看到为什么在那里使用$; ghci也没有帮助我,因为我在那里进行的测试似乎表明与简单省略$的版本等效.有人可以为我澄清一下吗?
所以我刚刚完成了我的第一个F#程序,我唯一的功能背景是对Haskell 的一点知识(读:没有真正生成任何程序).
在经历了一些令人难以置信的行为后,我开始意识到F#区分了:
prepareDeck = allSuits |> List.collect generateCards |> shuffle
Run Code Online (Sandbox Code Playgroud)
和
prepareDeck() = allSuits |> List.collect generateCards |> shuffle
Run Code Online (Sandbox Code Playgroud)
我注意到它"缓存"了前者,如果再次调用则不会重新计算它,而它将后者视为正常函数.你不能分辨出所讨论的功能是否有副作用,显然,但是我shuffle做到了!
这应该是常识吗?我还没有在任何教程材料上看到它.原因只是解析器中的一个弱点,有点像你在使用它之前必须声明一个函数?
我刚收到了专家F#2.0的副本并且发现了这个声明,这有点让我感到惊讶:
例如,在必要时,您可以对算法开头分配的私有数据结构使用副作用,然后在返回结果之前丢弃这些数据结构; 总体结果实际上是一种无副作用的功能.从F#库中分离的一个例子是List.map的库实现,它在内部使用变异; 写入发生在内部分离的数据结构上,其他代码无法访问.
现在,显然这种方法的优点是性能.我只是好奇是否有任何缺点 - 副作用带来的任何陷阱都适用于此吗?并行性是否受到影响?
换句话说,如果放弃表现,那么List.map以纯粹的方式实施会更好吗?
(显然这特别涉及F#,但我也对一般哲学感到好奇)
完全作为Ada类型系统学习练习,我试图制作3种类型(或者更确切地说,类型和2种子类型):
Month_Type,所有月份的列举Short_Month_Type,一个Month_Type只有30天的月份的子类型February_Month_Type,一个只有二月的子类型似乎子类型必须使用range机制,对吗?(还有其他类型的子类型吗?)为了让它与连续的范围一起工作,我必须Month_Type按以下顺序放置我的枚举:
type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);
Run Code Online (Sandbox Code Playgroud)
显然这不是几个月的自然顺序,我可以看到人们/我想要做什么Month_Type'First或者想要获得一月的东西.
所以,这个愚蠢的例子中有两个一般问题:
谢谢!
在查看我的反汇编代码时,我看到了很多以下内容:
00B442E9 push 4
00B442EB push 3
00B442ED lea ecx,[ebp-24h]
00B442F0 call Foo::Bar (0B41127h)
Run Code Online (Sandbox Code Playgroud)
我理解在通话之前推送参数,但是lea这里做了什么?
haskell ×4
f# ×3
syntax ×3
function ×2
monads ×2
operators ×2
ada ×1
assembly ×1
autocomplete ×1
c# ×1
c++ ×1
ide ×1
land-of-lisp ×1
linker ×1
pointfree ×1
refactoring ×1
side-effects ×1
types ×1
visibility ×1
visual-c++ ×1