2

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/1] メインのコンパイル ( exer.hs、解釈済み ) 失敗、モジュールのロード: なし。

このメッセージが表示される理由を誰か教えてもらえますか?

4

3 に答える 3

4

さまざまなエラーが発生します(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.

これはn、 の 2 番目の方程式の引数を忘れたためですcollatzList。この引数を追加することもできます

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)
于 2012-11-25T23:04:04.697 に答える
2

を再定義して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)
于 2012-11-25T22:57:43.063 に答える
0

前の値のみに依存する値のリストを生成することは、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 x0である場合Nothing、アルゴリズムは終了します。である場合、結果リストにJust (push, next)追加され、 の新しい値として使用されます。unfoldr を使用して最大 100 の正方形を生成する別の例:pushnextx0

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 関数では、正でない整数の結果は、例外ではなく空のリストです。)

于 2012-11-27T21:56:40.097 に答える