试着做: Prelude> reads "7a7" :: [(Int, String)] [(7,"a7")] Prelude> reads "7e7" :: [(Int, String)] [] 我在中间testing了所有可能的人物。 他们都工作,除了'e' 。 哈斯克尔似乎试图用科学记数法来解释这个数字,但它不能因为我要求的是整数。 这对我来说似乎是一个错误。
在我的业务领域 – 一家金融机构的后台IT部门 – 软件组件周围进行全局configuration,logging进度,出现某种error handling/计算短路是非常常见的事情。可以很好地用Haskell中的Reader,Writer,Maybe-monads等来模拟,并与monad变换器组合在一起。 但似乎有一些缺点:monad变换器背后的概念是相当棘手和难以理解的,monad变换器导致非常复杂的types签名,并造成一些性能损失。 所以我想知道:在处理上面提到的这些常见任务时,单变换器是否是最佳实践?
当阅读维基百科在Haskell 2010上的条目时,我偶然发现了这一点: — using only prefix notation and n+k-patterns (no longer allowed in Haskell 2010) factorial 0 = 1 factorial (n+1) = (*) (n+1) (factorial n) “n + k模式”是什么意思? 我想这是第二行,但我不明白这可能是错的。 任何人都可以解释那里有什么问题吗? 为什么Haskell 2010中不允许使用这些n + k模式?
我试着计算Ackermann(4,1) ,不同语言/编译器之间的性能差别很大。 以下是我的Core i7 3820QM,16G,Ubuntu 12.10 64bit , C:1.6s , gcc -O3 (用gcc 4.7.2) int ack(int m, int n) { if (m == 0) return n+1; if (n == 0) return ack(m-1, 1); return ack(m-1, ack(m, n-1)); } int main() { printf("%d\n", ack(4,1)); return 0; } OCaml:3.6s , ocamlopt (ocaml 3.12.1) let rec ack = […]
我有一个string列表,并试过这个: ls = [ "banana", "mango", "orange" ] main = do map PutStrLn list_of_strings 这没有用,我不明白为什么。 ghc print-list.hs print-list.hs:3:0: Couldn't match expected type `IO t' against inferred type `[IO ()]' In the expression: main When checking the type of the function `main' 任何提示? 我想这与地图返回一个列表,而不是一个值,但我没有find一个简单的方法来解决这个问题。 现在我知道打印string列表的唯一方法是编写一个迭代列表的函数,打印每个元素(如果列表是[a],则打印,但如果是(a:b)则打印并recursion)。 但是使用map会简单多了 谢谢!
我读过哈斯克尔的哈希表中存在的性能问题(2006年的Haskell-Cafe和2009年的Frog Consultancy的博客 ),而且因为我喜欢Haskell,所以我很担心。 那是一年前,现在是什么状态(2010年6月)? GHC中的“哈希表问题”是否已经被修复?
我可以用下面的脚本启动Excel。 但是在ghci(7.4.1)中,我运行它时出现了分段错误。 我不知道现在从哪里search。 我没有这个错误,如果我删除线 workSheets <- workBook # propertyGet_0 "Worksheets" 这是代码。 可能是我忘了一些东西。 我在这里阅读了com.hs的源代码,但是并没有给我任何线索。 import System.Win32.Com import System.Win32.Com.Automation — — createObjectExcel — coming from Automation.hs and com.hs — iidIDispatch_unsafe = mkIID "{00020400-0000-0000-C000-000000000046}" createObjExl :: IO (IDispatch ()) createObjExl = do clsidExcel <- clsidFromProgID "Excel.Application" pExl <- coCreateInstance clsidExcel Nothing LocalProcess iidIDispatch_unsafe return pExl fichierTest2 = "E:/Programmation/haskell/Com/qos1.xls" […]
假设你正在Haskell中build立一个相当大的模拟。 有许多不同types的实体,其属性随着仿真的进行而更新。 比方说,为了举例,你的实体被称为猴子,大象,熊等。 你维护这些实体的状态的首选方法是什么? 我想到的第一个也是最明显的方法是: mainLoop :: [Monkey] -> [Elephant] -> [Bear] -> String mainLoop monkeys elephants bears = let monkeys' = updateMonkeys monkeys elephants' = updateElephants elephants bears' = updateBears bears in if shouldExit monkeys elephants bears then "Done" else mainLoop monkeys' elephants' bears' 在mainLoop函数签名中明确提到每种types的实体已经很难mainLoop 。 你可以想象,如果你有20种实体,它将会变得非常糟糕。 (对于复杂的模拟来说,20是不合理的。)所以我认为这是一个不可接受的方法。 但是它的updateMonkeys是像updateMonkeys这样的函数在它们的function上是非常明确的:它们取得一个猴子列表并返回一个新的列表。 那么接下来的想法就是把所有的状态都放到一个大数据结构中,这样就清理了mainLoop的签名: mainLoop :: GameState -> […]
我不是在寻找一个拥有10年历史logging的超强健的解决scheme,而是寻找可以在真实应用程序中使用的东西,而不仅仅是能够运行Hello World示例。 我的首选是在服务器上运行编译器,所以我可以提前编译Haskell代码。 当然,这个解决scheme不仅仅是一个编译器,还需要Haskell代码来访问浏览器上可用的API(DOM,XHR …)。 脚注:到目前为止,我所看到的项目似乎并没有得到积极的维护,或者超越了能够运行“Hello world”,甚至超出了项目描述的范围。
我在程序中使用了很多不同的logging,其中一些使用了相同的字段名称,例如 data Customer = Customer { …, foo :: Int, … } data Product = Product { …, foo :: Int, … } 现在,由于访问函数“foo”被定义了两次,我得到了“多个声明”的错误。 避免这种情况的一种方法是使用导入完全限定的不同模块,或者只是重命名字段(我不想这样做)。 在Haskell中正式提出的处理方法是什么?