Tag: haskell

组成两个比较函数?

我想先sorting一个属性,然后再sorting(如果第一个属性是相同的)。 Haskell中sortBy两个比较函数的惯用方法是什么,即与sortBy使用的函数? 特定 f :: Ord a => a -> a -> Ordering g :: Ord a => a -> a -> Ordering 构成f和g会产生: hxy = case v of EQ -> gxy otherwise -> v where v = fxy

如何阻止GHC生成中间文件?

当通过ghc –make foo.hs编译一个haskell源文件ghc –make foo.hs GHC总是会留下除foo.exe之外的各种中间文件。 这些是foo.hi和foo.hi 我经常最终不得不删除.hi和.o文件以避免混淆文件夹。 GHC是否有命令行选项不留下中间文件? (当问到#haskell时,我得到的最佳答案是ghc –make foo.hs && rm foo.hi foo.o

是什么让Haskell的types系统比其他语言的types系统更“强大”呢?

阅读Scalatypes系统与Haskell的缺点? ,我不禁要问:具体来说,Haskell的types系统比其他语言的types系统(C,C ++,Java)更强大。 显然,即使Scala也不能像Haskell的types系统那样执行一些相同的function。 究竟是什么使Haskell的types系统(Hindley-Milnertypes推断)如此强大? 你能给个例子吗?

Print和putStrLn在Haskell中的区别

我很困惑。 我尝试使用print ,但我知道人们应用putStrLn 。 他们之间真正的区别是什么? print $ function putStrLn $ function

幻影types背后的动机?

Don Stewart的Haskell在大型演讲中提到幻影types : data Ratio n = Ratio Double 1.234 :: Ratio D3 data Ask ccy = Ask Double Ask 1.5123 :: Ask GBP 我读了他的关于他们的子弹点,但我不明白他们。 另外,我读了关于这个主题的Haskell Wiki 。 但是我仍然错过了他们的观点。 什么是使用幻影types的动机?

在OCaml中Haskell的types类最接近什么?

有什么方法可以完成Haskell的类类在OCaml中的工作? 基本上,我想写一个多态的函数,而不写太多的代码。 做多态的典型方法是提供一个额外的参数,告诉函数是目前正在处理的types。 例如,假设我想对整数列表进行sorting,我必须将一个额外的比较器传递给该函数。 type comparison = Lesser | Equal | Greater my_sort : (a' -> a' -> comparison) -> 'a list -> 'a list 无论如何告诉OCaml,我的types是可比较的,而不用为每种我想要分类的types编写比较器函数? 这意味着我的sortingfunction看起来就像这样: my_sort : 'a list -> 'a list

为什么差异列表比常规连接更有效?

我现在正在通过在线学习你一个haskell书籍,并且已经到了一个章节,作者正在解释一些列表连接可能是不够的:例如 ((((a ++ b) ++ c) ++ d) ++ e) ++ f 据说效率不高。 作者提出的解决scheme是使用定义为“差异列表” newtype DiffList a = DiffList {getDiffList :: [a] -> [a] } instance Monoid (DiffList a) where mempty = DiffList (\xs -> [] ++ xs) (DiffList f) `mappend` (DiffList g) = DiffList (\xs -> f (g xs)) 我很难理解为什么在某些情况下DiffList在计算上比简单的级联更有效率。 有人能够简单地向我解释为什么上面的例子效率很低,DiffList以什么方式解决了这个问题?

究竟是什么让选项在斯卡拉monad?

我知道monads是什么以及如何使用它们。 我不明白的是,让我们说, Option一个monad? 在Haskell中,一个monad Maybe是一个monad,因为它是从Monad类实例化的(至less有两个必要的函数return并bind ,使得Monad类实际上是一个monad)。 但在斯卡拉我们有这样的: sealed abstract class Option[+A] extends Product with Serializable { … } trait Product extends Any with Equals { … } 没有关系到monad。 如果我在Scala中创build自己的类,默认情况下会是monad吗? 为什么不?

在Haskell中优化数组的性能

我正在研究类似MineCraft的世界的地形生成algorithm。 目前,我正在使用Simplex Noise Demystified(PDF)中的实现方法来使用单工噪声,因为单纯的噪声应该比Perlin噪声更快并且产生更less的伪像。 这看起来相当不错(见图片),但到目前为止,它也很慢。 对于块(16x16x128块)中的每个块运行噪声函数10次(对于地形高度,温度,树木位置等,我需要具有不同波长的噪声),每个块有3个八度的噪声,或者大约100万次调用噪声function总共大约需要700-800毫秒。 尽pipe事实上在algorithm中没有明显的昂贵的操作(至less对我来说),但对于产生具有任何体面的速度的地形而言,这至less是一个数量级太慢的速度。 只是楼,模,一些数组查找和基本的算术。 下面列出了algorithm(用Haskell编写)。 SCC的意见是为了分析。 我省略了二维噪声function,因为它们的工作方式是一样的。 g3 :: (Floating a, RealFrac a) => a g3 = 1/6 {-# INLINE int #-} int :: (Integral a, Num b) => a -> b int = fromIntegral grad3 :: (Floating a, RealFrac a) => V.Vector (a,a,a) grad3 = V.fromList $ [(1,1,0),(-1, 1,0),(1,-1, 0),(-1,-1, […]

我什么时候想要使用免费的Monad + Interpreter模式?

我正在开发一个项目,其中包括一个数据库访问层。 很正常,真的。 在之前的一个项目中,合作者鼓励我将Free Monad概念用于数据库层,所以我这样做了。 现在我试图在我的新项目中决定我所获得的。 在之前的项目中,我有一个相当像这样的API。 saveDocument :: RawDocument -> DBAction () getDocuments :: DocumentFilter -> DBAction [RawDocument] getDocumentStats :: DBAction [(DocId, DocumentStats)] 等约二十个这样的公共职能。 为了支持他们,我有了DBAction数据结构: data DBAction a = SaveDocument RawDocument (DBAction a) | GetDocuments DocumentFilter ([RawDocument] -> DBAction a) | GetDocumentStats ([(DocId, DocumentStats)] -> DBAction a) | Return a 然后是monad实现: instance Monad DBAction where […]