私は Haskell で長くて少し風変わりな関数を持っています。
(#==#) :: String -> String -> Bool
str1 #==# str2 = (sum[ 1 | index <- [0..(max (length str1) (length str2))], (str1!!index == str2!!index || str1!!index == '$')] == (max (length str1) (length str2)))
要するに、この関数は 2 つの文字列が同一かどうかをチェックし、1 つ以上の '$' があれば同一と見なします [長いバージョン: 解読の時間を節約するために、2 つの文字列、リスト内包表記内のインデックス変数が必要です0 から最長の文字列の長さまで。次に、現在のインデックスにある各文字列の要素が相互に比較されるか、ドル記号と比較されます。どちらもOKです。それらがそれらの 1 つである場合、新しいリストに 1 が追加され、この新しいリストの合計が長さと等しい場合、その単語は一致します。
ただし、これを実行しようとすると、独特のエラーが発生します。
*Practice> let totals = (sum[ 1 | index <- [1..(max (length str1) (length str2))], (str1!!index == str2!!index || str1!!index == '$')] == (max (length str1) (length str2)))
*Practice> totals
*** Exception: Prelude.(!!): index too large
私は調査を行ってきましたが、この特定のエラーに対する解決策は見つかりませんでした。誰かがそれについて何か知っているなら、私はそれを最も感謝します.
(ところで、エラーの「インデックス」は、関数で使用するインデックスと同じではありません)