... 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 } } }
}
しかし、これは通常、良いスタイルとは見なされません。