haskell-jp / beginners #22 at 2022-12-15 19:30:52 +0900

double x = x + x
listdouble (x:xs)=[double x] ++ listdouble xs 

によってリストの各要素を二倍にする関数を定義しようとしてみたのですが、エラーが生じてしまいました。具体的には
listdouble [1,2,3,4]

をGHCiでコンパイルすると
[2,4,6,8*** Exception: <interactive>:41:1-43: Non-exhaustive patterns in function listdouble

というエラーが生じます。定義が間違っていると思うのですが、何が間違っているのか理解できずにいます。
駒鳥(hxf_vogel)
空リストの時の扱いも定義してあげてください
返信ありがとうございます。質問には空リストの扱いは書き忘れていたのですが、
listdouble [] = []

を定義に入れてもほぼ同様のエラーメッセージが出てしまいました。
もしかして,全てGHCiで

ghci> listdouble (x:xs) = [double x] ++ listdouble xs <<ENTERキーを押す>>
ghci> listdouble [] = [] <<ENTERキーを押す>>

とやっていますか? だとすれば,これはlistdoubleを場合分けして定義しているのではなく,第一の定義を第二の定義でシャドーイングしていることになります.例えば:

ghci> x = 3 :: Int
ghci> x
3
ghci> x = 4 :: Int
ghci> x
4

のように.同名の別変数の定義とみなされるわけですね.ある関数を場合分けして,二個以上の式で定義したいときには,ソースコードの中でなら,同スコープに意識せずに書けばシャドーイングも起こらず正しく定義できますが,GHCiにベタ打ちする場合,直前のご質問に @igrep さんがお答えのように,

ghci> double x = x + x
ghci> :{
ghci> listdouble (x:xs) = [double x] ++ listdouble xs
ghci> listdouble [] = []
ghci> :}

のごとく, :{:} を使って「グループ化された一個の定義だよ」と指示しながら定義してやるとうまく行きます.
ありがとうございます。`:{ :}` を忘れていただけのようです。以前にも教えていただいたことを早速忘れてますね。