2012-01-01 9 views
9

のコードの下スニペットリストを生成generateUpTo関数を作成する試みの一部ではないがNmaxをしたがってRMAXに依存をpAllSorted。コンパイルしようとすると、コンパイラがでRMAXについて「ない範囲で」エラーを与えるしかしハスケル - スコープ

nmax = rmax `div` 10 

pass = rmax `elem` mot 
fail = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 

、(ここでは何であるか)ライン1,3と4

(どのように)することができますI generateUpToの機能を使用するまで定義しないと、rmaxは未定義になりますか?

+7

ハスケル初心者の質問を投票し続ける人には、あなたが知っていると分かっていれば、これをやっている理由についてのコメントを残しておくと非常に役に立ちます。 – Phyx

+1

私たちは彼をアップアップします! :)もっと真剣に、 "私の仕事は私のために"宿題を尋ねる人々のために多くの虐待がありました。多分それは間違いでした。 – gatoatigrado

+1

@Phyx実際、私は初心者の質問に投票しないようにしていますが、おそらく私は下降者について説明することができます。これらの質問の多くは、「あまりにも地域化された」という言葉が一般的で興味深いものではありません。 –

答えて

9

あなたはarguementとして、それを通過することなくnmax内部rmaxpass、そしてfailを使用する場合は、generateUpTowhereブロックに含める必要があります。それ以外の場合は、文字通り「範囲外」です。例:あなたは、これらの機能は、複数の場所で使用したい場合、あなたは可能性だけarguementとしてRMAX accect

generateUpTo rmax = check rmax 
    where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 
     nmax = rmax `div` 10 
     pass = rmax `elem` mot 
     fail = rmax `notElem` mot 

nmax rmax = rmax `div` 10 
pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

注 - また、あなたの定義といくつかの問題を持っているように見えますcheck ... passfailの値checkの値だけがあり、上で定義した関数ではありません。

更新

数nmax(外-どこ-ブロックスコープのバージョン)を使用するように、あなたはそれにRMAXの値を渡す必要があります。これと同じように:

nmax rmax -- function application in Haskell is accomplished with a space, 
      -- not parens, as in some other languages. 

ただし、nmaxの定義で名前rmaxはもはや重要ではありません。これらの機能はすべてまったく同じです:

nmax rmax = rmax `div` 10 
nmax a = a `div` 10 
nmax x = x `div` 10 

同様に、あなたはrmaxという名前の値でそれを呼び出す必要はありません。

nmax rmax 
nmax 10 -- this is the same, assuming rmax is 10 
nmax foo -- this is the same, assuming foo has your 'rmax' value. 
+0

** pAllsorted **が他の場所で定義されていて、** nmax **がその定義で使用されている場合、問題を解決するためにこのメソッドを使用すると** nmax **が有効になりますか?私の2番目の例では –

+0

...はい、 'where'ブロックの外で動作するはずです。それを呼び出すには、rmaxの値が何であれ、それを渡す必要があります。例: 'nmax 10'または' nmax myRmaxVal' –

+0

あなたはrmaxの値をそれに渡す方法を明確にすることができますか? –

4

はちょうどあなたがcheckでやったように、generateUpTowhere句にnmaxpassfailの定義を置きます。

2
nmax rmax = rmax `div` 10 

pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
    check pass = pAllSorted 
    check fail = error "insert multiple of 10!" 

RMAXは、それが宣言された関数の外に定義されていない関数のパラメータです。この例では、関数nmaxのrmaxは、generateUpToのrmaxとは完全に無関係です。