我最近发现了FP bug(试图学习Haskell),到目前为止我已经看到了(一流的功能,懒惰的评估和所有其他好东西).我还不是专家,但是我已经开始发现在功能上比在基本算法上强制推理更容易(而且我很难回到我必须去的地方).
然而,当前FP看起来平坦的一个领域是GUI编程.Haskell方法似乎只是包装命令式GUI工具包(例如GTK +或wxWidgets)并使用"do"块来模拟命令式样式.我没有使用过F#,但我的理解是它使用OOP和.NET类做了类似的事情.显然,有一个很好的理由 - 当前的GUI编程完全是关于IO和副作用的,所以对于大多数当前的框架来说,纯函数式编程是不可能的.
我的问题是,是否可以使用GUI编程的功能方法?我无法想象在实践中这会是什么样子.有没有人知道任何尝试此类事物的框架(实验或其他)(或者甚至是为功能语言设计的任何框架)?或者只是使用混合方法的解决方案,其中OOP用于GUI部件,FP用于逻辑?(我只是想出于好奇心 - 我很想认为FP是"未来",但GUI编程似乎是一个非常大的漏洞.)
我只是好奇Haskell中列表的一些确切的实现细节(GHC特定的答案很好) - 他们是天真的链接列表,还是他们有任何特殊的优化?进一步来说:
length和(!!)(例如)必须遍历列表?length两次,它是否必须迭代两次)?fib = 1:1:zipWith (+) fib (tail fib),是否会递归计算每个值,还是依赖于先前的计算值?)任何其他有趣的实施细节将不胜感激.提前致谢!
我正在学习Haskell,类型类似乎是一种强大的类型安全多态函数.但是很多Haskell Prelude函数都没有使用它们.进一步来说:
大多数列表功能不与其他数据结构的工作(例如,foldr并且length只对列表实现,不能在阵列中使用).
Data.ByteString除非您使用,否则类似的模块不可用,import qualified因为它们包含与Prelude函数具有相同名称的函数.
如果标准库使用类型类的泛型函数,似乎这两个问题都会消失(请告诉我,如果我完全不在此基础上).
我有两个问题:
Prelude是否有这样的技术或设计理由,还是出于历史原因?
环顾四周,看起来有几个库(比如
Data.Foldable,如果我没有弄错的话,Scrap Your Boilerplate)用标准替代品替换标准的Prelude函数.有没有计划将这些想法融入Haskell的未来版本?
Objective-C属性默认为atomic,它确保访问器是原子的,但不能确保整体线程安全性(根据这个问题).我的问题是,在大多数并发场景中,原子属性是不是多余的?例如:
场景1:可变属性
@interface ScaryMutableObject : NSObject {}
@property (atomic, readwrite) NSMutableArray *stuff;
@end
void doStuffWith(ScaryMutableObject *obj) {
[_someLock lock];
[obj.stuff addObject:something]; //the atomic getter is completely redundant and could hurt performance
[_someLock unlock];
}
//or, alternatively
void doStuffWith(ScaryMutableObject *obj) {
NSMutableArray *cachedStuff = obj.stuff; //the atomic getter isn't redundant
[_someLock lock];
[cachedStuff addObject:something]; //but is this any more performant than using a nonatomic accessor within the lock?
[_someLock unlock];
}
Run Code Online (Sandbox Code Playgroud)
场景2:不可变属性
我在想,在处理不可变对象时,原子属性可能对避免锁有用,但由于不可变对象可以指向Objective-C中的可变对象,所以这并没有多大帮助:
@interface SlightlySaferObject : NSObject …Run Code Online (Sandbox Code Playgroud) haskell ×3
cocoa ×1
f# ×1
ghc ×1
iphone ×1
linked-list ×1
objective-c ×1
polymorphism ×1
properties ×1