【问题标题】:Haskell Instance of Num issueHaskell 实例的 Num 问题
【发布时间】:2013-12-25 12:13:31
【问题描述】:

这段代码有什么问题?

rectangle :: Int -> Int -> String
rectangle i j
    | i < 0 || j < 0    = ""
    | otherwise         = concatenate(i) ++ "n/" ++ (rectangle i) j-1




concatenate :: Int -> String
concatenate i
    | i <= 0            = ""
    | otherwise         = "*" ++ concatenate(i-1)

这是我得到的错误

  ERROR line 3 - Instance of Num [Char] required for definition of rectangle

这应该是它的作用(例如)

Main> putStr (rectangle 3 4)
****
****
****

【问题讨论】:

  • @Ingo 抱歉,刚刚注意到并修复了它,但是发生了同样的错误
  • 没有矩形的第二个参数,你正在做String ++ (Int -&gt; String)
  • "但是如果我把它放在提示符上,它会说不在范围'n'内。"请改用let factor n = 等。 GHCi 提示就像在一个非常大的 do 语句中一样(没有 do)。
  • "但是在 Haskell 中,由于变量是不可变的,我将如何做某事++ 的事情?"你随身携带世界状态,包括变量。旧状态是输入的一部分,新状态是输出的一部分。您可以使用类型为 doSomething :: s -&gt; a -&gt; (s, b) 的函数手动执行此操作,或者在状态 monad 中为您携带它,使类型为 doSomethingM :: (MonadState s m) =&gt; a -&gt; m b.
  • @Rhymoid 您好,您是否可以通过电子邮件或其他方式帮助解决这些问题?这是另一个问题 - 定义一个函数 swapwords,它接受三个字符串值 w1、w2 和 s,并返回 s,字符串 s 中所有出现的字符串 w1 被字符串 w2 替换,例如非常感谢!

标签: string haskell int concatenation


【解决方案1】:

这段代码应该可以工作。

rectangle :: Int -> Int -> String
rectangle i j
    | i < 0 || j < 0    = ""
    | otherwise         = concatenate i ++ "\n" ++ rectangle i (j-1)




concatenate :: Int -> String
concatenate i
    | i <= 0            = ""
    | otherwise         = "*" ++ concatenate (i-1)

很少有cmets:

concatenate(i) ==> concatenate i
-- You don't need to put parameters in brackets in haskell.
(rectangle i) j-1 ==> rectangle i (j-1)
-- See Ingo's explanation
"n/" ==> "\n"
-- That should be obvious

【讨论】:

  • @Ingo @zudov 非常感谢,只是一个随机问题我有以下问题但是不知道该怎么做。你对此有什么想法吗?谢谢!定义一个函数 flagpattern,它采用大于或等于 5 的正 Int 值并返回一个字符串,该字符串可以显示为以下维度 n 的“标志”模式,例如Main> putStr (flagpattern 7) ******* ** ** * * * * * * * * * * * ** ** *******
【解决方案2】:

你迟早会习惯 Haskell 语法。这里

(rectangle i) j-1

被解析为

(rectangle i j) - 1

但你真的想要:

rectangle i (j-1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多