7

次の例を使用するチュートリアルを読んでいます (多少一般化します)。

f :: Foo -> (Int, Foo)
...
fList :: Foo -> [Int]
fList foo = x : fList bar
  where
    (x, bar) = f foo

私の質問は、それらが取得されたタプルの外で名前でx参照できるように見えるという事実にあります。bar私の推測が正しければ、これは他の言語でパラメータリストを分解するように見えるでしょう。(つまり、次のことを行う必要はありませんでした:)

fList foo = (fst tuple) : fList (snd tuple)
      where
        tuple = f foo

私はこの行動について正しいですか?私が読んでいるチュートリアル/本でまだ言及されているのを見たことがありません。誰かがこの件に関する詳細情報を教えてもらえますか?

編集:何か(リスト、配列など)を同様の方法で分解できますか、それともタプルでのみこれを行うことができますか?

4

4 に答える 4

2

私はこの行動について正しいですか?

はい。ただし、名前は、それらを定義したブロックにのみ存在します。あなたの場合、これはあなたのwhere句が適用される論理ユニット、つまり内部の式を意味しますfList

于 2009-01-10T23:31:49.583 に答える
1

それを見る別の方法は、このようなコードです

x where x = 3

とほぼ同等です

let x = 3 in x
于 2009-01-11T01:25:53.657 に答える
0

はい、あなたが正しい。where 句にバインドされた名前は、where 句の前にある完全な宣言に表示されます。あなたの場合、それらの名前はfbarです。

(Haskell を学ぶ上で難しいことの 1 つは、変数が定義されている場所よりも前の場所で、ソース コード内の変数を使用することが許可されているだけでなく、一般的であることです。)

Haskell 98 Reportまたは にある多くの優れたチュートリアルの 1 つで、句がどこにあるかについて詳しく読む場所haskell.org

于 2009-01-11T01:12:38.193 に答える