小编Mat*_*nov的帖子

如何在haskell中获取变量名称

我来到haskell有一些c背景知识,并想知道是否有类似的

#define print( a ) printf( "%s = %d\n", #a, a )

int a = 5;
print( a );
Run Code Online (Sandbox Code Playgroud)

应该打印

a = 5
Run Code Online (Sandbox Code Playgroud)

haskell

11
推荐指数
2
解决办法
1437
查看次数

Haskell - GHC中的问题编译

我对Haskell很新,我最近用GHC安装了这个平台.我决定通过编译一个简单的Hello world程序来测试它:main = putStrLn "Hello, world"

现在,当我进入命令行(Windows 7),找到正确的目录并输入时ghc hello.hs,它返回以下消息:"[1 of 1]编译Main(hello.hs,hello.o)".我知道,一旦完成编译,它应该跟随"链接hello.exe ...",但这永远不会到来,并且没有.exe生成.

基本上,有没有明显的理由为什么会发生这种情况?代码有问题,有什么我不知道的,或者我应该尝试重新安装Haskell平台?

谢谢.

windows haskell compilation ghc

11
推荐指数
2
解决办法
1906
查看次数

受限制的Monoid类型值组成

我有一个数据类型是一个实例,Monoid所以我可以得到很好的值组成:

data R a = R String (Maybe (String ? a))

instance Monoid (R a) where
  mempty = R "" Nothing
  R s f `mappend` R t g = R (s ++ t) (case g of Just _ ? g; Nothing ? f)
Run Code Online (Sandbox Code Playgroud)

接下来,我不想将所有R a值相互组合,在我的域中没有意义.所以我介绍幻像类型t:

{-# LANGUAGE DataKinds, KindSignatures #-}

data K = T1 | T2
data R (t ? K) a = R String (Maybe (String ? a))

instance Monoid (R t a) …
Run Code Online (Sandbox Code Playgroud)

haskell

11
推荐指数
1
解决办法
239
查看次数

执行顺序(>> =)不是我的预期

我有一系列网络请求,每个请求大于10秒.
为了让用户知道发生了什么,我给出了更新:

main = do putStr "Downloading the first thing... "
          {- Net request -}
          putStrLn "DONE"
          putStr "Downloading the second thing... "
          {- Net request -}
          putStrLn "DONE"
Run Code Online (Sandbox Code Playgroud)

使用GHCi,这可以按预期工作,但编译或使用runghc,"下载"不打印直到"完成".

我用(>> =)和(>>)重写了它,但是我遇到了同样的问题.

这是怎么回事?

monads haskell do-notation

9
推荐指数
1
解决办法
231
查看次数

在Haskell中定义函数的正确方法

我是Haskell的新手,我正在尝试一些教程.我写了这个脚本:

lucky::(Integral a)=> a-> String
lucky 7 = "LUCKY NUMBER 7"
lucky x = "Bad luck"
Run Code Online (Sandbox Code Playgroud)

我把它保存为lucky.hs并在解释器中运行它并且工作正常.

但我不确定函数定义.从我读过的小小看来,我可以同样定义幸运函数如下(函数名称为lucky2):

lucky2::(Integral a)=> a-> String
lucky2 x=(if x== 7 then "LUCKY NUMBER 7" else "Bad luck")
Run Code Online (Sandbox Code Playgroud)

两者似乎同样有效.显然,功能幸运是清晰的阅读,但是是lucky2编写一个函数以正确的方式?

haskell

9
推荐指数
2
解决办法
5183
查看次数

如何在monad变压器内部分叉

比如说,考虑一些monad变换器堆栈

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
...
newtype J = J { runJ :: ErrorT Foo (StateT Bar IO) a } deriving (Applicative, Functor, etc)
Run Code Online (Sandbox Code Playgroud)

以及一些功能J:

peekNextQuux :: J Quux
peekNextQuux = ...

withJ :: J a -> IO (Either Foo a)
withJ = ...
Run Code Online (Sandbox Code Playgroud)

然后我发现自己在J上下文中.我可以写

f = withJ $ peekNextQuux >>= liftIO . print
Run Code Online (Sandbox Code Playgroud)

现在我想在J上下文中的单独线程中查看和打印quuxes

g = withJ . liftIO . forkIO . forever $ peekNextQuux >>= liftIO . print
Run Code Online (Sandbox Code Playgroud)

这显然是行不通的.我想有一些方法可以解决这么简单的问题,只是想不出来.

haskell monad-transformers

9
推荐指数
2
解决办法
919
查看次数

GHCi和编译的代码似乎表现不同

我有一个非常奇怪的问题.与在ghci中运行相比,以下代码在编译时给出不同的结果,

main = do
  putStr "Please enter your name: "
  name <- getLine
  putStr ("Hello, " ++ name ++ ", how are you?")
Run Code Online (Sandbox Code Playgroud)

当它在ghci中运行时,它就像人们期望的那样,

Please enter your name: dglmoore
Hello, dglmoore, how are you?
Run Code Online (Sandbox Code Playgroud)

但是,当我将代码编译为可执行文件时,它需要在生成任何输出之前提供输入,所以我最终得到了这个,

dglmoore
Please enter your name: Hello, dglmoore, how are you?
Run Code Online (Sandbox Code Playgroud)

我以前见过类似的问题,但我似乎无法再找到它.

我在Haskell平台版本2012.2.0.0中使用ghc版本7.4.1.

任何人都知道为什么他们会给出不同的结果以及我如何让这两个版本做"正确"的事情?

io haskell

8
推荐指数
1
解决办法
289
查看次数

如何从用户标识中检索用户名

我正在从一本书中学习,在Unix上实现(ls)命令.在使用(-l)标志执行(ls)命令的编码部分期间,我看到我必须提示文件的用户名和组名.到目前为止,我有以下几行中的用户和组ID:

struct stat statBuf;

statBuf.st_uid; //For the user id. 
statBuf.st_gid; //For the group id. 
Run Code Online (Sandbox Code Playgroud)

在Unix上的默认(ls)命令中,打印文件的信息的方式是显示用户名而不是用户ID.

任何人都可以帮我找到正确的方法来从他们的ID中检索用户名和组名吗?

c unix file-descriptor system-calls stat

7
推荐指数
2
解决办法
1万
查看次数

6
推荐指数
3
解决办法
2231
查看次数

在Racket中有没有像'try'这样的功能

现在,我正在通过查看The Seasoned Schemer这本书来吸取阴谋家.我通过球拍编写代码,但是当我使用时try,计划器没有这个方法或宏.它报告扩展:模块中的未绑定标识符:try.代码如下:(在第89页)

(define (remove-member-first* a lat)
   (try oh (rm a lat oh) lat))
Run Code Online (Sandbox Code Playgroud)

我搜索了球拍文件,但没有找到熟悉的功能.

那么谁知道是否有类似'尝试'的功能呢?

scheme racket seasoned-schemer

6
推荐指数
2
解决办法
551
查看次数