小编Chr*_*ris的帖子

将`let`和`where`表达式的结果存储在haskell中吗?

我对Haskell很新,在阅读了这篇以及关于严格性的一些性能提示后,我仍然想知道这是如何适用于letwhere表达式的.如果我有以下代码:

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.但是,如果没有,则e1otherwise表达式中替换,然后在每次遇到它时进行评估,或者在第一次遇到它时进行评估,然后在所有后续事件中进行存储和重用?也:

  • 有没有办法"手动"控制这个过程?
  • 这取决于天气我在ghci中运行代码或用GHC编译它并在GHC编译中它依赖于像这样的标志-o吗?

这与这个问题非常相似,但我找不到Haskell的答案.

解释非常感谢.

evaluation haskell

7
推荐指数
1
解决办法
204
查看次数

如果它有多个Type-parameter,如何使一个类型构造函数成为Functor类型类的一部分?

我试图了解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,如果可能的话,如何将其部分应用于其类型参数?

谢谢.

haskell functor type-constructor

3
推荐指数
1
解决办法
147
查看次数

通过将列表转换为集合再转换回列表对列表进行排序的时间复杂度

我最近观看了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) 将集合转换回列表还是我在这里遗漏了什么?

python sorting list set time-complexity

2
推荐指数
2
解决办法
389
查看次数