整数のリストを受け取り、文字列を返す必要があるこの関数があります
generateSTR :: [Int] -> String
generateSTR ([]) = ""
generateSTR (x) = daux (x (maximum x) x "")
where daux ((x:xs) mh y:ys strdib)
| mh == 0 = daux xs mh ys (strdib ++ "-")
| mh <= h = daux (xs mh ys (strdib ++ "*"))
| mh > h = daux (xs mh ys (strdib ++ " "))
| mh == 0 && length(lh) == 0 = daux xs (mh-1) ys (strdib ++ "\n")
daux ([] mh lh strdib) = strdib
問題は、エラーが発生することです。
"Parse error in pattern: (x : xs)"
しかし、私は自分が間違っていることを理解できません。
確かにそれはばかげたエラーですが、私はHASKELLの初心者で、夢中になっていると思います!。
このHaskell構文f x y z
は、他の言語がとして書くものとは異なる構文ではありませんf(x,y,z)
。それはそれと同等です、はい、しかしそれはまた同等であるという意味でのみf(z,y,x)
です:あなたはまだ区別をする必要があります。
Haskell関数は通常カレーで書かれています。つまり、f
「3つのパラメーターを受け入れる」場合、実際に行うことは、1つのパラメーターを受け入れ、次に別のパラメーターを受け入れ、次に別のパラメーターを受け入れることです。
f x y z ≡ ((f x) y) z
言い換えると、f
は、結果が関数であり、結果が関数である関数です。その3番目の関数の結果だけが「最終結果」です。したがって、明らかにそれを書くことはできませんf (x y z)
。つまり、関数をとにf
適用した結果に適用される、まったく異なるものになります。x
y
z
おそらくこれはすべて複雑に聞こえますが、カリー化によって非常に簡潔で強力なコードを記述できる状況が多くあります。それ以外の場合は、心配する必要はありません...実際にグループ化されていない括弧を記述しないでください。独立した部分式!
あなたの例に適用-これはそれを書く正しい方法です:
generateSTR :: [Int] -> String
generateSTR [] = ""
generateSTR x = daux x (maximum x) x ""
where daux (x:xs) mh y:ys strdib
| mh == 0 = daux xs mh ys $ strdib ++ "-"
| mh <= h = daux xs mh ys $ strdib ++ "*"
| mh > h = daux xs mh ys $ strdib ++ " "
| mh == 0 && length lh == 0 -- note: this actually doesn't work, `lh` is not in scope here.
= daux xs (mh-1) ys $ strdib ++ "\n"
daux [] mh lh strdib = strdib
$
まだ演算子に出会っていない場合:演算子の両側を括弧で囲むのと同じ効果があります。
daux xs mh ys $ strdib ++ "-"
≡ (daux xs mh ys) (strdib ++ "-")
...そして私が言ったように、(f x y z) w
実際にはと同じなf x y z w
ので、この場合はと同じdaux xs mh ys (strdib ++ "-")
です。ただし、と同じでdaux (xs mh ys (strdib ++ "-"))
はありません。代わりに、関数xs
をmh
、ys
などに適用することを意味します。もちろんxs
、リストであるため機能しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加