在以下代码中:
ismaxl :: (Ord a) => [a] -> a -> Bool
ismaxl l x = x == maxel
where maxel = maximum l
main = do
let mylist = [1, 2, 3, 5]
let ismax = ismaxl mylist
--Is each call O(1)? Does each call remember maxel?
let c1 = ismax 1
let c2 = ismax 2
let c3 = ismax 3
let c5 = ismax 5
putStrLn (show [c1, c2, c3, c5])
Run Code Online (Sandbox Code Playgroud)
部分函数是否为max,计算maxel?特别是,有人可以指出关于Haskell中部分函数的复杂性的规则吗?在上面的例子中,编译器必须只调用一次最大值吗?换句话说,部分函数是否保留了内部where子句的先前调用的引用?
我有一些CPU限制的代码不能令人满意,我正在寻找可能的错误,我的理由是复杂性.
performance profiling haskell partial-application lazy-evaluation
Python有(1,)一个元素元组.在Scala中,(1,2)适用于Tuple2(1,2)但是我们必须使用Tuple1(1)获得的单个元素的元组.这可能看起来像一个小问题,但设计期望产品的API对于传递单个元素的用户来说很难处理,因为他们必须编写Tuple1(1).
也许这是一个小问题,但Scala的一个主要卖点是打字更少,输入更少.但在这种情况下,似乎更多打字更多打字.
请告诉我:1)我错过了这个,它以另一种形式存在,或者2)它将被添加到该语言的未来版本中(并且它们将接受补丁).
考虑使用特定版本化jar来实现方法的常见情况,但不公开公共或受保护API中该jar的任何类型(仅在私有方法的方法签名中).
现在我想要的是通过名称自动编译时链接此代码 - 修改原始包名称并将其替换为SBT中生成的代码(同样:我想在SBT中添加插件或在build.sbt中添加设置这样做每一个sbt compile).
这样做的目的是避免使用具有相同包/类名的类的多个可能不兼容的版本的类路径错误.注意:在我上面描述的情况中,内联或这个名称修改应该始终有效,并允许一个人走向版本地狱(以更大的罐子为代价).
scala ×2
haskell ×1
jar ×1
java ×1
performance ×1
profiling ×1
sbt ×1
syntax ×1
tuples ×1
versioning ×1