2017-10-08 7 views
0

これは、リストと数値を指定すると、数字の位置(最初の位置0)のリストの要素を返します。どこでどこで使用できますか?

基本的にその関数は(!!)です。私が直面している問題は、この機能に制限する必要があることです。与えられた位置がリスト内の位置よりも大きい場合、私は使用しようとしましたが機能しません、このエラーを示します:

parse error on input `where' 

ここでwhereを使用できますか?状況によってはwhereを使用できますか?

localiza:: [a]->Int->a 

localiza [a] 0 = a 
localiza (a:as) b = localiza (as) (b-1) 
        where b+1 <= length(a) 
+0

'position'がリストの長さよりも小さい場合は、その位置に要素を返しますが、位置が長さより大きい場合は関数が返すべき値は何ですか? –

+2

あなたがここで望んでいるのはガードであり、「どこで」はありません。 –

+0

ガードはどのように使用できますか?もし位置が長さよりも大きければ、それは可能ではないはずです –

答えて

3

In Haskell whereには、ローカル定義のセットが導入されています。任意の定義にアタッチして、その定義にローカルな変数を定義することができます。コード内の問題は、whereを使用する場所ではなく、使用する場所の問題です。

ローカル変数を定義しようとしていないため、パターンに条件を追加しようとしています。そのためには、pattern | boolean-conditionの構文(localiza (a:as) b | b < length as = ...)を持つパターンガードを使用します。

これは本当にこれを行う良い方法ではありません。 lengthはO(n)操作なので、反復の各ステップで長さをチェックすると時間が浪費されます。代わりに、リストが空になったときにケースをキャッチできます。これは、インデックスが範囲外だった場合にのみ発生します。

0

私はHaskell wikiからこの例をあげるつもりです。

elementAt' (x:_) 1 = x 
elementAt' [] _  = error "Index out of bounds" 
elementAt' (_:xs) k 
    | k < 1   = error "Index out of bounds" 
    | otherwise  = elementAt' xs (k - 1) 

これは長さを頻繁にチェックしません。リストが空になると終了します。

関連する問題