用于简单测试的 Haskell 多段 do 语句

Haskell mulitline do statements for simple testing

提问人:13sen1 提问时间:12/12/2020 更新时间:12/13/2020 访问量:51

问:

如果我想快速评估一堆单行相等性测试,我该如何在 Haskell 中做到这一点?我不想安装任何东西或做任何花哨的事情。

目前,我可以一次运行一个语句,但是我怎么能在它逐行执行它们的语句中做到这一点呢?

下面是一个有效的示例:

a = 5
b = 6
c = 7

tests2 = do
  a == 5
--  b == 6
--  c == 7

这将返回

True

因为 B 和 C 被注释掉了。但是,如果我尝试运行所有三个,如下所示:

a = 5
b = 6
c = 7

tests2 = do
  a == 5
  b == 6
  c == 7

然后我收到一个错误。我怎样才能让它回来

True
True 
True

这只是一个非常简单的问题,我试图快速解决,我知道这不是编写 Haskell 的正确方式,我可以做一些花哨的事情来检查,我只是在寻找一些超级简单和快速的东西。

Haskell 等式

评论

2赞 willeM_ Van Onsem 12/12/2020
你什么都没有,这就是函数返回的内容,并且. 只是绑定表达式的语法糖。printdodo
1赞 13sen1 12/12/2020
谢谢,这对我来说太愚蠢了。答案是:a = 5 b = 6 c = 7 tests2 = do print ( a == 5 ) print ( b == 6 ) print ( c == 7 )
0赞 Will Ness 12/13/2020
一个更简单的答案是。tests2 = [ a == 5, b == 6, c == 7 ]
0赞 radrow 12/13/2020
“返回”和“打印”是截然不同的东西。显然,ghci 打印出返回的东西(如果可能的话),但这不是它在正常编译程序中的工作方式
0赞 Jon Purdy 12/15/2020
@13sen1:为了将来参考,当你需要在这里的注释中编写Haskell代码时,由于你不能使用缩进的语法糖,你应该使用显式的大括号(在、...、和块之间)和分号(在定义和分支之间),这样你的代码在语法上是正确的,并且更容易阅读和复制,例如:.您还可以使用反引号(如 ),方法是将代码括起来,使用双反引号。{}docaseofwherelet;casea, b, c :: Int; a = 5; b = 6; c = 7; tests2 :: IO (); tests2 = do { print (a == 5); print (b == 6); print (c == 7); };a `mod` b

答:

4赞 willeM_ Van Onsem 12/12/2020 #1

块不执行任何操作。将项目结合在一起是句法糖。但对于一个表达式来说,就等价于 。dodo xx

如果你这样写:

tests2 = do
  a == 5

那么这相当于:

tests2 = a == 5

因此,这是一个将返回 .Bool

如果你在 a 下写多个表达式,它将尝试用 **(>>) :: Monad m => m a -> m b -> m b 绑定这些表达式,所以:do

tests2 = do
  a == 5
  b == 6
  c == 7

相当于:

tests2 = (a == 5) >> (b == 6) >> (c == 7)

但是 a 不取类型参数,所以不能工作。Bool

如果要打印结果,可以使用 print :: Show a => a -> IO () :

tests2 :: IO ()
tests2 = do
    print (a == 5)
    print (b == 6)
    print (c == 7)

ow 的类型为 。tests2IO ()