我对Haskell很新,在阅读了这篇以及关于严格性的一些性能提示后,我仍然想知道这是如何适用于let和where表达式的.如果我有以下代码:
f :: Int -> Int -> Int
f a b
|a==b = <simple computation>
|otherwise = e1 + 2 * e1 - e1^2
where e1 = <lengthy computation>
Run Code Online (Sandbox Code Playgroud)
经常<lengthy computation>评估的频率如何?我假设如果给出Haskell的懒惰评估,e1则根本不进行评估a==b.但是,如果没有,则e1在otherwise表达式中替换,然后在每次遇到它时进行评估,或者在第一次遇到它时进行评估,然后在所有后续事件中进行存储和重用?也:
-o吗?这与这个问题非常相似,但我找不到Haskell的答案.
解释非常感谢.
我试图了解Functor-Typeclass在Haskell中的工作方式.如果你有一个函数,f :: a -> b -> c并且你想部分地将它argB应用于获取一个带有一个参数的函数,你可以简单地做:
f' :: a -> c
f' x = f x argB
Run Code Online (Sandbox Code Playgroud)
并使用它.当使用类似这样的东西制作Functor-Typeclass的一部分时,是否有可能获得这样的行为:
instance Functor (MyTypeconstructor _ argB) where
fmap <implementation of fmap>
Run Code Online (Sandbox Code Playgroud)
我知道你可以将Type-constructor部分应用于它的第一个type-parameter(标准currying):
instance Functor (MyTypeconstructor argA) where
fmap <implementation of fmap>
Run Code Online (Sandbox Code Playgroud)
但是second / third / all except one,如果可能的话,如何将其部分应用于其类型参数?
谢谢.
我最近观看了Raymond Hettingers 谈论 Python 字典(以及扩展集......),他提到整数散列到它们自己,并且将整数添加到字典(或集合......)将按顺序插入它们,只要你不要删除项目,订单将保留在 python 3.6(可能是更高版本?)中。在对这个问题的回答中指出,字典保留插入顺序,但对于集合而言,它的接缝就像整数一样根据它们的值进行排序。
现在,根据所述python.org的时间复杂度的部分,并且更详细这里它被指出,添加元素的一组的平均时间复杂度是O(1)。这意味着如果您有一个未排序的整数列表,应该可以通过简单地对它们进行排序:
sorted_list = list(set(unsorted_list))
Run Code Online (Sandbox Code Playgroud)
就我测试过的情况而言,情况确实如此(用随机序列做了几 1000 次)。
我现在的问题是:这是否意味着可以在 O(n) 时间内对 Python 中的整数进行排序?
对我来说它会接缝,因为它需要 O(n) 来构建集合和 O(n) 将集合转换回列表还是我在这里遗漏了什么?