1

foldr (+) 0 [1,2] 戻り値3

を使用してどのように書くことができ'where'ますか?

foldr f 0 [1,2] where f = (+)戻り値"parse error on input 'where'"

編集:実際には、例のようにデカルト積を作ろうとしています

cprod = foldr f [[ ]]
where f xs yss = foldr g [ ] xs
where g x zss = foldr h zss yss
where h ys uss = (x : ys) : uss

whereしかし、ファイルをロードしようとすると、これも input で解析エラーが発生します。

4

2 に答える 2

4

... where ...は表現ではありません。where式ではなくバインディングに関連付けられています。

:を使用することも、何らかのバインディングで使用することもできますlet: 。let f = (+) in foldr f 0 [1,2]x = foldr f 0 [1,2] where f = (+)


以下は、編集したコードの構文的に有効なバージョンです (まだ壊れていますが、もはや構文上の問題ではありません :-) )。whereバインディングごとに 1 つだけ使用しwhere、関数の本体よりもインデントする必要があります。

cprod = foldr f [[ ]]
  where
    f xs yss = foldr g [ ] xs
    g x zss = foldr h zss yss
    h ys uss = (x : ys) : uss

もう一度見てみると、私はあなたのコードを誤解していたことがわかりました。3 つwhereの がありました。それぞれを前の関数に適用したかったからです。その場合where、私が言ったように sをインデントする必要があります。

cprod = foldr f [[ ]]
  where f xs yss = foldr g [ ] xs
          where g x zss = foldr h zss yss
                  where h ys uss = (x : ys) : uss

このように使用することに固執しwhere、深くインデントされたコードが気に入らない場合は、レイアウトではなく明示的な{}/を使用できます。;極端なケースは

{
cprod = foldr f [[ ]]
where { f xs yss = foldr g [ ] xs
where { g x zss = foldr h zss yss
where { h ys uss = (x : ys) : uss } } }
}

しかし、これは通常、良いスタイルとは見なされません。

于 2012-11-29T10:08:47.890 に答える
3

編集に応じて、コードは次のようになります

cprod = foldr f [[ ]]
  where f xs yss = foldr g [ ] xs
          where g x zss = foldr h zss yss
                  where h ys uss = (x : ys) : uss

重要なことは次のとおりです。

  • where式ではなく方程式に関連付けられています
  • は、それが接続されている方程式に対して相対的にインデントするwhere必要があります (したがって、最初のwhereものは よりもインデントされcprod、2 番目のwhereものは よりもインデントされますf)。
  • シャチャフの答えは構文的に正しいです。しかし、あなたのコード例では、 defined inをh使用し、 defined in を使用しているため、この場合、追加の関数ごとに追加が必要になるのはそのためです。xggyssfwhere
于 2012-11-29T10:35:41.580 に答える