在我的GHC Haskell应用程序利用stm,networkingpipe道和pipe道,我有一个分支为每个套接字使用runTCPServer自动分叉。 股可以通过使用广播TChan与其他股沟通。 这展示了我想如何build立pipe道“链”: 所以,我们这里有两个源(每个绑定到helper的pipe道),它产生一个Packet对象, encoder将接受并转换成ByteString ,然后发送出套接字。 对于两种投入的有效融合(性能是一个问题)我有很大的困难。 如果有人能指出我正确的方向,我将不胜感激。 既然发这个问题而不作出任何尝试是不礼貌的,我会把我以前在这里试过的东西放进去; 我写/select了一个函数(阻塞)从TMChan(可closures的通道)产生一个源。 — | Takes a generic type of STM chan and, given read and close functionality, — returns a conduit 'Source' which consumes the elements of the channel. chanSource :: (MonadIO m, MonadSTM m) => a — ^ The channel -> (a -> STM (Maybe […]
我有一个问题,从学习你一个Haskell (伟大的书,不要dising它)以下的段落: 一个很大的区别是,正确的折叠在无限的列表上工作,而左边的不是! 说白了,如果你在某个时候拿出一个无限的列表,而你从右侧折叠起来,你最终会到达列表的开头。 但是,如果你在一个点上有一个无限的列表,而你试图从左边折叠它,那么你将永远无法达到目的! 我只是不明白这一点。 如果你有一个无限的列表,试着把它从右边折叠起来,那么你将不得不从无穷远处开始,这是不会发生的(如果有人知道你可以做到这一点的语言, )。 至less,根据Haskell的实现,你必须从Haskell的实现开始,因为在Haskell中,foldr和foldl不会接受一个参数来确定列表中哪些位置应该开始折叠。 我会同意这个引用iff foldr和foldl接受了一个参数来确定列表中他们应该开始折叠的位置,因为如果你从一个已定义的索引中取出一个无限的列表并开始折叠, 它将最终终止,不pipe你从哪里开始, 你会向无穷大折叠。 然而,foldr和foldl 并不认为这个论点,因此这个引用是毫无意义的。 在Haskell中,无限列表中的左alignment和右alignment都不会终止 。 我的理解是正确的还是我错过了什么?
请注意其他潜在的贡献者:请不要犹豫,使用抽象或math符号来expression您的观点。 如果我发现你的答案不清楚,我会请求澄清,但是可以随意以舒适的方式expression自己。 要清楚的是:我不是在寻找一个“安全的” head ,也不是特别有意义的head的select。 问题的实质是关于head和head'的讨论,这些提供了背景。 我已经跟Haskell打了几个月了(到了它已经成为我的主要语言的地步了),但是我承认对于一些更高级的概念和语言的哲学的细节并不是很了解我非常乐意学习)。 那么我的问题就不是技术问题了(除非是这个问题,我只是没有意识到),因为这是一个哲学问题。 对于这个例子,我是说head 。 我想你会知道, Prelude> head [] *** Exception: Prelude.head: empty list 这head :: [a] -> a 。 很公平。 显然,不能返回(挥手)没有types的元素。 但同时,定义也很简单(如果不是微不足道的话) head' :: [a] -> Maybe a head' [] = Nothing head' (x:xs) = Just x 在某些陈述的评论部分,我已经看到了这方面的一些小讨论。 值得注意的是,一个Alex Stangl说 “有充分的理由不要让一切”安全“,并在违反先决条件时抛出exception。 我不一定质疑这个说法,但我很好奇这些“好理由”是什么。 另外,保罗·约翰逊说, '例如,你可以定义“safeHead :: [a] – >也许是一个”,但是现在不是处理一个空列表或者certificate它不能发生,你必须处理“Nothing”或者certificate它不能发生“。 我从这个评论中读出的语气表明,这在困难/复杂性/某事方面显着增加,但我不确定我是否掌握了他在那里展示的内容。 […]
我真的search这一个。 (E / TextMate是我在这个主题中发现的最接近的,但似乎没有什么大不了的) 我试过emacs,但我似乎没有find一个Haskell模式的Windows .. VisualHaskell似乎并没有遵循新的VisualStudio更新… 我可以尝试VIM,但Haskell模式是否适用于Windows? 唉……一直以来都是“亲密但不香烟”的感觉。 在Windows下编程的Haskell实际上是这样吗?
我想在Haskell中做一些如下所示的事情: main1 = do s <- getLine if s == "foo" then putStr "You entered foo" 显然这是不合法的,因为没有else 。 我想到的一个select: nop :: IO () nop = sequence_ [] main2 = do s <- getLine if s == "foo" then putStr "You entered foo" else nop 这有点冗长,但如果有必要的话我会解决的。 但是,如果没有内置的nop版本,我会感到惊讶。 或者: doIf :: Bool -> IO () -> IO […]
我将要以分散的结构教授一门低级课程。 我select了离散结构,逻辑和可计算性的教科书,部分原因是它包含有助于用函数式编程语言实现的示例和概念。 (我也认为这是一本很好的教科书。) 我想要一个易于理解的FP语言来说明DS的概念,并且学生可以使用。 充其量,大多math生在Java中只有一到两个学期的程序devise。 看过Scheme,Erlang,Haskell,Ocaml和SML之后,我已经select了Haskell或Standard ML。 我倾向于Haskell出于下面列出的原因,但我希望那些积极的程序员的意见,在一个或另一个。 Haskell和SML都有模式匹配,这使得描述recursionalgorithm变得简单。 哈斯克尔有很好的列表理解,很好地匹配这样的列表在math上expression。 Haskell有懒惰的评价。 非常适合使用列表理解技术构build无限列表。 SML有一个真正的交互式解释器,可以在其中定义和使用函数。 在Haskell中,函数必须在单独的文件中定义并在交互式shell中使用之前进行编译。 SML以一种容易理解的语法给出了函数参数和返回types的明确确认。 例如:val foo = fn:int * int – > int。 哈斯克尔的隐含的咖喱语法更为呆板,但并不完全陌生。 例如:foo :: Int – > Int – > Int。 Haskell默认使用任意精度的整数。 这是SML / NJ的外部图书馆。 SML / NJ会将输出截断为70个字符。 Haskell的lambda语法是微妙的 – 它使用一个反斜杠。 SML更加明确。 不知道我们是否需要这门课的lambda。 本质上,SML和Haskell大致相同。 我倾向于Haskell,因为我喜欢Haskell中的列表理解和无限列表。 但是我担心Haskell的紧凑语法中大量的符号可能会导致学生的问题。 从我读过的其他文章中可以看出,Haskell不推荐用于FP的初学者。 但是我们不打算构build完整的应用程序,只是尝试简单的algorithm。 你怎么看? 编辑:在阅读你的一些很好的回应,我应该澄清我的一些要点。 在SML中,在解释器中定义函数和在外部文件中定义函数之间没有语法上的区别。 假设你想写出阶乘函数。 […]
我是Haskell的新手。 我正在尝试和无法从Data.Traversable模块Data.Traversable的traversefunction。 我无法看清楚这一点。 既然我来自一个必要的背景,有人可以请一个必要的循环来解释吗? 一个伪代码将不胜感激。 谢谢。
在Scala中,代数数据types被编码为sealed的一级types层次结构。 例: — Haskell data Positioning a = Append | AppendIf (a -> Bool) | Explicit ([a] -> [a]) // Scala sealed trait Positioning[A] case object Append extends Positioning[Nothing] case class AppendIf[A](condition: A => Boolean) extends Positioning[A] case class Explicit[A](f: Seq[A] => Seq[A]) extends Positioning[A] 对于case class和case object ,Scala会生成一堆类似equals , hashCode , unapply (被模式匹配使用)等等,它们带给我们许多传统ADT的关键属性和特性。 但是有一个关键的区别 […]
当我使用Javascript进行编程时,我发现能够使用debugging器在任何时候停止程序执行并能够从那里运行命令并检查variables,这是非常方便的。 现在回到Haskell,有没有办法在交互式GHCI REPL中运行任意函数,还是仅限于在顶层声明的东西? 什么是工作和debugging内部函数和值的“标准”方法?
我正在四处寻找stackoverflow 非平凡的懒惰评估 ,这导致了我Keegan McAllister的介绍: 为什么学习Haskell 。 在幻灯片8中,他显示了最小函数,定义如下: minimum = head . sort 并指出它的复杂性是O(n)。 我不明白为什么复杂性被说成是线性的,如果通过replacesorting是O(nlog n)。 文章中提到的sorting不能是线性的,因为它不会假设数据,因为线性sorting方法(比如计数sorting)会要求sorting。 懒惰的评价在这里扮演着一个神秘的angular色吗? 如果是的话,背后的解释是什么?