为了调试目的,我们如何打印当前状态值?例如,在http://www.haskell.org/haskellwiki/State_Monad的 concrete-example-1的代码中 ,如何在读取每个输入字符后打印当前状态值?
module StateGame where
import Control.Monad.State
type GameValue = Int
type GameState = (Bool, Int)
playGame :: String -> State GameState GameValue
playGame [] = do
(_, score) <- get
return score
playGame (x:xs) = do
(on, score) <- get
case x of
'a' | on -> put (on, score + 1)
'b' | on -> put (on, score - 1)
'c' -> put (not on, score)
_ -> put (on, score)
playGame xs
startState = (False, …Run Code Online (Sandbox Code Playgroud) 我是haskell的初学者,并使用最新的GHCi 2011.2.0.1.我经常遇到的一个挫折是,互联网和书籍中的例子(甚至来自官方的haskell.org网站,例如http://www.haskell.org/haskellwiki/State_Monad的示例-2 )都不会编译.它需要几轮狩猎和发布问题才能找出问题所在.甚至RWH书中的一些例子都不起作用.
这是新版本的haskell还是haskell-platform的问题?语言/平台是否正在开发且不稳定,或者只是示例已过时?无论哪种方式,新学生找到正确的例子来学习的最佳方法是什么?
更具体地说,您可以帮助修复上面提到的状态monad示例吗?
我喜欢在Haskell开发,但目前面临挑战.在我的教育地点,我对我的帐户没有管理权限.我想在那里调试/测试.我需要一种方法来运行Haskell代码而无需安装haskell-platform或者ghci需要管理级别的权限.例如,一个将运行haskell代码的网站(abeit仅限于不包括文件访问权限)或java实用程序(或独立.app,但由于"家长控制"的性质,java是首选),或其他我没有想到.Ruby或Python中的源代码或编译的Java,Flash和源代码优先于本机代码.这是在Mac OS X 10.6上,供参考.
因此,如果我想在ghci中运行线程应用程序,我只需-threaded在启动时传递给ghci.但是从Emacs内部启动时我该怎么做?我可以为此自定义Emacs haskell模式吗?
我想是的,但我找不到任何指示?我找不到emacs lisp的任何参考文档.只有Haskell维基但没有参考.虽然我正在学习,但我对(Emacs)lisp并不是很熟悉.
我想如果我能找到安装haskell-platform的默认emacs软件包的位置,我可以通过源读取来试图找出它.
在C中,如果我想将int除以2,则x%2应该运行得快,(x%10)% 2
因为好的编译器只会查看最后一位.但是在具有无限精度算术的语言中呢?
特别是在Haskell中会更快(或者它们是相同的速度):even x或者even (quot x 10)?
compiler-construction haskell haskell-platform integer-arithmetic
当我尝试从hackage安装Stylish-haskell软件包时,我会相对一致地得到相同的错误.安装顺利进行,直到它安装导管,这不能正确安装.
错误消息的结尾:
17 warnings and 2 errors generated.
Failed to install conduit-1.0.8
cabal: Error: some packages failed to install:
conduit-1.0.8 failed during the building phase. The exception was:
ExitFailure 1
stylish-haskell-0.5.8.0 depends on conduit-1.0.8 which failed to install.
yaml-0.8.5.1 depends on conduit-1.0.8 which failed to install.
Run Code Online (Sandbox Code Playgroud)
我得到的完整终端输出是:
Configuring conduit-1.0.8...
/var/folders/cn/67wph78d62qc1v_lm7z2mb980000gn/T/32054.c:1:12:
warning: control reaches end of non-void function [-Wreturn-type]
int foo() {}
^
1 warning generated.
Building conduit-1.0.8...
Preprocessing library conduit-1.0.8...
Data/Conduit/Binary.hs:165:14:
warning: missing terminating ' character [-Winvalid-pp-token]
let c' = …Run Code Online (Sandbox Code Playgroud) 我刚安装了haskell-platform我的系统(Ubunto 12.04,如果重要的话).我发现cabal仍然是版本1.14.0.0,这导致了问题.我也有一些regex-base当前但是针对古老版本的MTL库编译的软件包(即).解决依赖关系的问题.
有人可以帮助我完成所需的步骤,以使haskell平台的所有部分都是最新的.
我正在尝试使用readMaybe函数,它应该在Text.Read库中,但是当我编译时,我会收到以下消息:
Module `Text.Read' does not export `readMaybe'
Run Code Online (Sandbox Code Playgroud)
任何人都可以说我做错了什么?谢谢 ;)
正如GHC文档所说,设置+RTS -N将使用多个线程来运行程序.如果我的程序是一个简单的单线程程序(即不par,不是forkIO),如下所示怎么办?
m = 10^6
wr 0 = return ()
wr i = do
appendFile "/tmp/data.nothing" $ show(i)++"\n"
wr (i-1)
main = do
wr m
putStrLn "done"
Run Code Online (Sandbox Code Playgroud)
但是,当我使用-Ds(调度调度程序)标志运行程序时,我得到了以下日志
all threads:
threads on capability 0:
threads on capability 1:
thread 7 @ 0x7fd5b0199000 is not blocked (TSO_DIRTY)
thread 1944 @ 0x7fd592dc6390 is not blocked (TSO_DIRTY)
thread 1945 @ 0x7fd592def8a8 is not blocked
thread 1946 @ 0x7fd592dc6790 is not blocked
thread 1947 @ 0x7fd592e0f790 …Run Code Online (Sandbox Code Playgroud) 如果我有以下代数数据类型
type MyVal = Either String Int
Run Code Online (Sandbox Code Playgroud)
并具有包含MyVal类型的元素的列表
ls = [Right 1, Right 2, Right 3]
xs = [Right 1, Left "error", Right 3]
Run Code Online (Sandbox Code Playgroud)
现在,我想写函数找出那是我所有具有“ Right”值的列表,然后它应该返回True,否则返回False。
在这种情况下,ls它将返回True,xs并且将返回False。
我怎样才能做到这一点?
我尝试使用all函数,但无法正确使用它。