小编gat*_*ado的帖子

Haskell中的无限递归

这个问题基本上是使用GHCi在Haskell程序调试无限循环的重复.那里的作者手动解决了它,虽然我想知道其他解决方案.

(我的特殊问题)

我有一个包含递归调用的箭头代码,

testAVFunctor = proc x -> do
    y <- errorArrow "good error" -< x
    z <- isError -< y
    (passError ||| testAVFunctor) -< trace "value of z" z
Run Code Online (Sandbox Code Playgroud)

errorArrow应使递归testAVFunctor无法执行,因为这将导致ISERROR返回一个Left (AVError "good error")应依次选择passError路由,绕过递归调用.

非常奇怪的是,在功能组合等热门网站上插入"跟踪"调用会导致程序发出有限量的输出,然后冻结.不是我对无限期扩张问题的期望.(见编辑1)

如果有人这么好奇我在这里上传了我的源代码.

编辑1

我没有找到正确的地方(如果你想看看源,显然avEither正在循环).我到那里的方法是编译二进制文件,然后运行gdb:

  • gdb主要
  • r (运行代码)
  • Ctrl + C (发送中断).回溯将毫无用处,但你可以做的就是被击中
  • s (步骤).然后,按住回车键; 你应该看到很多方法名称飞过.希望其中一个是可识别的.

您可以使用ghc标志-O0进行编译以禁用优化,这可以显示更多方法名称.

编辑3

显然,proc x -> do上面的块导致代码生成组合器,组合器调用AVFunctor.arr …

debugging haskell arrows infinite-loop ghci

5
推荐指数
1
解决办法
1053
查看次数

Haskell - 如何指定类型类实例?

我有一个(相当)合法的情况,有两个类型实例实现,我想指定一个默认的实例.在注意到使用Int类型的模块化算法导致大量的哈希冲突之后,我想尝试GHC的Int64.我有以下代码:

class Hashable64 a where
    hash64 :: a -> Int64

instance Hashable64 a => Hashable a where
    hash = fromInteger . toInteger . hash64

instance Hashable64 a => Hashable64 [a] where
    hash64 = foldl1 (\x y -> x + 22636946317 * y) . map hash64
Run Code Online (Sandbox Code Playgroud)

和一个实例Hashable64 Char,从而导致两个实现Hashable String,即:

  • 中定义的那个Data.Hashable.
  • 注意它是一个Hashable64实例,然后转换为常规Int的实例Data.Hashable.

第二个代码路径可能更好,因为它使用Int64s 执行散列.我可以指定使用实例Hashable String的这个派生吗?

编辑1

对不起,我忘了添加我已经尝试了重叠实例的事情; 也许我只是没有正确实现它?重叠实例的文档说,当一个实例更具体时,它可以工作.但是当我尝试添加特定实例时Hashable String,情况并没有改善.完整代码在[ http://pastebin.com/9fP6LUX2 ](抱歉多余的默认标题).

instance …
Run Code Online (Sandbox Code Playgroud)

haskell instance typeclass

5
推荐指数
1
解决办法
1191
查看次数

"cabal install ___"打破了之前安装的软件包

我发现cabal安装包令人抓狂时的行为.例如,跑步

cabal install funsat
Run Code Online (Sandbox Code Playgroud)

安装旧版本array,time,random,quickcheck,和bitset,破包,比如monadiccp,hoogle,heist,snap,等.

它可以返回cabal install monadiccp等等,但是如何避免cabal破坏已安装软件包的默认行为?在安装新软件包时,任何合理的Linux软件包管理器,aptitude或者zypper我是否要破坏已安装的软件包.

有人制作了一个变通脚本吗?提前致谢.

haskell ghc cabal

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

Redshift:有什么方法可以计算模糊字符串相似度/字符串编辑距离?

在 PSQL(我相信 Redshift 基于它)中,有像levenshtein/ levenshtein_less_equal[ http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html ]这样的字符串相似度函数。这些功能似乎没有进入 Redshift [ http://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html ]。我错了,还是有人提出了创造性的查询来解决此限制?

postgresql edit-distance amazon-redshift

5
推荐指数
1
解决办法
4508
查看次数

F#:使用成员函数作为未绑定函数的任何方法?

有没有办法提取成员函数,并将它们用作F#函数?我希望能够写下列内容:

mystring |> string.Split '\n' |> Array.filter (string.Length >> (=) 0 >> not)
Run Code Online (Sandbox Code Playgroud)

如果您[让]上面的代码有效

let mystring = "a c\nb\n"
let stringSplit (y:char) (x:string) = x.Split(y)
let stringLength (x:string) = x.Length
mystring |> stringSplit '\n' |> Array.filter (stringLength >> (=) 0 >> not)
Run Code Online (Sandbox Code Playgroud)

f# function member-functions

4
推荐指数
1
解决办法
247
查看次数

- 有没有办法复制到搜索词,_包括这个词?

如果我有以下的话

cat Oliver Louis
Run Code Online (Sandbox Code Playgroud)

并且光标在"c"上,我可以复制到路易斯的开头y/Louis<CR>(其中"CR"是回车键),这将复制字符串"cat Oliver".

有没有办法复制搜索词"路易斯",以及复制的"猫奥利弗路易斯"字符串?提前致谢.

vim copy-paste

4
推荐指数
1
解决办法
247
查看次数

Haskell - 用于标记集分区的内容是什么?

初学者问题 - 您通常将什么用作多图?我想要一个带标签功能的函数,并按每个标签分区元素.例如,

f x | x `mod` 2 == 0 = EVEN
    | otherwise = ODD
Run Code Online (Sandbox Code Playgroud)

的输出partition f lst,其中lst :: [Int]

EVEN --> [list of even numbers]
ODD --> [sublist of odd numbers]
Run Code Online (Sandbox Code Playgroud)

对不起,我在Hoogle上找不到类似的东西.我想我可以通过那里Data.List.Keygroup功能,sort和一些映射,但必须有一个更简单的方法,不是吗?这似乎是一个普遍有用的功能.

haskell multimap

4
推荐指数
1
解决办法
445
查看次数

ghc 7.4.1分支在哪里?

对不起,这是一个愚蠢的问题; 我如何下载GHC 7.4.1分支?我想玩ConstraintKinds.默认分支似乎说它是7.3版.我确实环顾了一下,但没有看到任何有用的东西,或github存储库中任何名为"7.4"的分支.谢谢!

(PS 如果您是GHC开发人员,将信息添加到http://hackage.haskell.org/trac/ghc/milestone/7.4.1可能会有所帮助吗?)

haskell ghc building

4
推荐指数
1
解决办法
277
查看次数

gvim - 想象某些unicode字符时的问题

我有几个vim快捷方式来插入希腊语和数学字符.(对于更好看的评论和Haskell代码.)不幸的是,"forall"字符似乎插入?þX而不是仅仅?.这种行为是否适合您,是否有解决方法?

imap <expr> <A-a> "?"
imap <expr> <A-b> "?"
imap <expr> <A-g> "?"
imap <expr> <A-l> "?"
imap <expr> <S-A-f> "?"
imap <expr> <S-A-e> "?"
Run Code Online (Sandbox Code Playgroud)

您必须使用gvim才能使用"Alt"组合键; 您可以将"A"更改为"C",并尝试在vim需要时使用它.同样的错误出现在我面前.

(似乎我无法映射"alt + key"和"shift + alt + key",但是当它成为问题时我会担心.)

unicode vim

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

在Haskell中编写类似信号量的代码的最佳方法是什么?

假设我有一个f带整数参数的函数.f可能不会终止某些论点,但其结果同样有价值.(具体来说,参数可以是随机数生成器的种子,它被传递给SAT求解器.)

我想用并发和调用f 1,f 2,f 3等,并在第一个结束返回.因此,每个线程应该运行看起来像的代码

comp <- start_proc (f 1)
wait(comp || anyDone) -- wait for _either_ of these signals to be true
if comp then
    set anyDone = True
Run Code Online (Sandbox Code Playgroud)

最简单的方法是什么?我想到了AMB操作员,但我需要同时运行所有进程(例如在24或80核计算机上).(分布式计算解决方案会更好.)对AMB维基页面的肤浅看法表明它可能不支持非终止进程?

测试

目前,我没有得到满足我想要的答案.我认为这可能更像是我创建流程的方式而不是其他任何问题.

限定

runProc (x:xs) =
    createProcess (proc x xs) >>= \(_, _, _, h) -> waitForProcess h
Run Code Online (Sandbox Code Playgroud)

然后,我希望赛runProc ["zsh", "-c", "sleep 3"]runProc ["ls"].我修改了托马斯的回答,但是没有用.

raceL :: [IO ?] -> IO ?
raceL ops …
Run Code Online (Sandbox Code Playgroud)

parallel-processing concurrency haskell

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