【问题标题】:collatz-list implementation using haskell使用haskell的collat​​z-list实现
【发布时间】:2012-11-13 10:24:27
【问题描述】:

我正在尝试使用 Haskel 实现 collat​​z-list: 这是我的代码:

collatz n
     | mod n 2 == 0 = div n 2
     | otherwise =  3 * n + 1


collatzList n
        | n < 1 = error "Cannot have negative number"
collatzList
        | n == 1 = [n]
        | otherwise = n:collatzList (collatz n)

我收到的错误消息是这样的: 输入“collat​​zList”解析错误 [1 of 1] 编译 Main(exer.hs,解释) 失败,已加载模块:无。

谁能告诉我为什么会收到这条消息?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    生成仅依赖于前一个值的值列表是unfoldr 函数 (Data.List.unfoldr) 的典型应用:

    import Data.List (unfoldr)
    collatzList = unfoldr nextCollatz
          where nextCollatz n | n <= 0    = Nothing
                              | n == 1    = Just (1,0)
                              | even n    = Just (n, n `quot` 2)
                              | otherwise = Just (n, 3*n+1)
    

    unfoldr f x0 取一个起始值x0,并对其应用函数f。如果f x0Nothing,则算法终止;如果是Just (push, next),则将push 添加到结果列表中,并使用next 作为x0 的新值。另一个例子,使用展开器生成最多 100 个正方形:

    import Data.List (unfoldr)
    squareList = unfoldr pow2
          where pow2 n | n > 100   = Nothing
                       | otherwise = Just (n, 2*n)
                       -- "Add n to the result list,
                       -- start next step at 2*n."
    

    (关于error 的强制性说明:通常最好让函数返回一些虚拟值。例如,在我上面的 Collat​​z 函数中,非正整数的结果是空列表而不是异常。)

    【讨论】:

      【解决方案2】:

      我得到不同的错误(使用 GHC 7.4.1):

      > :load "/tmp/C.hs"
      [1 of 1] Compiling Main             ( /tmp/C.hs, interpreted )
      
      /tmp/C.hs:9:11: Not in scope: `n'
      
      /tmp/C.hs:9:21: Not in scope: `n'
      
      /tmp/C.hs:10:23: Not in scope: `n'
      
      /tmp/C.hs:10:46: Not in scope: `n'
      Failed, modules loaded: none.
      

      这是因为您忘记了 collatzList 的第二个等式中的 n 参数。您可以添加此参数

      collatzList n
              | n < 1 = error "Cannot have negative number"
      collatzList n -- the n was missing here
              | n == 1 = [n]
              | otherwise = n:collatzList (collatz n)
      

      或者,由于左侧现在相同,您可以简单地将其与第一个连接:

      collatzList n
              | n < 1 = error "Cannot have negative number"
              | n == 1 = [n]
              | otherwise = n:collatzList (collatz n)
      

      【讨论】:

      • @user1462452:是的,这在 GHC 7.4.1 上编译得很好。鉴于您收到的错误消息,我建议您仔细检查您的缩进。也许您将制表符与空格混合在一起,这往往会导致像这样的“不可见”语法错误。
      【解决方案3】:

      你正在重新定义collatzList

      collatzList
              | n == 1 = [n]
              | otherwise = n:collatzList (collatz n)
      

      这样做:

      collatz n
           | mod n 2 == 0 = div n 2
           | otherwise =  3 * n + 1
      
      collatzList n
              | n < 1 = error "Cannot have negative number"
              | n == 1 = [n]
              | otherwise = n:collatzList (collatz n)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 2019-03-09
        相关资源
        最近更新 更多