0
import Data.List.Split
import Data.List(nub, groupBy)

z = splitOn "+" "x^2+2*x^3+x^2"

y = map (splitOn "*") z

x = map head y

toInt :: [String] -> [Int]
toInt = map read

u1 = filter ((< 2) . length) y
u2 = filter ((> 1) . length) y

v = map ("1" :) u1

q = u2 ++ v
q2 = zip toInt(map head q) (map last q)
q6 = groupBy nub(map tail q) q
q3 = map tail q
q5 = nub(q3)

q1 = map head q

1.の場合

zip toInt(map head q) (map last q)

頭を整数に変換した後、頭を尾に戻したいのですが、結果は次のようになります。[[1,"x^3"],[2,"x^2"],[1,"x^2"]]

できます

*Main Data.List> zip [2,1,1] ["x^3","x^2","x^2"]
[(2,"x^3"),(1,"x^2"),(1,"x^2")]

しかし、上記はできません、そして私が気づいた違いがあります、これは()、ではありません[]

groupBy2.リストへの書き方、groupBy グループ化後、頭を追加するための個別の要素を渡しました

groupBy (nub(map tail q)) q

:1:10:期待されるタイプa0 -> a0 -> Bool' with actual type[a1]に一致しませんでしたnub' In the first argument of'groupBy'の呼び出しの戻りタイプ、つまり `(nub(map tail q))'式:groupBy(nub(map tail q)) q

qはハッシュテーブルのようなもので、2番目の要素でグループ化できないようです

4

1 に答える 1

5

1つの問題は、zip toInt(map q) (map last q)思ったとおりに解析されていないことです。

Cスタイルの構文を持つ言語とは異なり、haskellは上記を次のように解析します

 zip toInt (map head q) (map last q)

(スペースに注意してください)。

つまり、それはあなたが望む方法toIntの結果には適用されませんmap head q。代わりにzip toInt (map head q)、関数とリストを圧縮しているため、タイプエラーが発生します。

代わりに欲しいのは

 zip (toInt (map head q)) (map last q)

またはもう少し簡潔に

 zip (toInt $ map head q) (map last q)

2番目の問題については、構文に関して同様の問題が発生しています。また、への最初の引数は、groupByグループを作成する目的で平等を決定する関数である必要があります。

于 2011-04-19T13:27:41.903 に答える