1

私はHaskellを初めて使用し、:演算子を使用して文字列を文字列のリストに追加しようとしていますが、どういうわけか正しく機能していません...このコードは機能しています:

sl:(printH header):sl:(map printR t)

しかし、次slのように、最後にも文字列を追加しようとすると:

sl:(printH header):sl:(map printR t):sl

それはエラーをスローしますが、これは私には意味がありません (他の結合がうまくいったので):

Couldn't match type '[Char]' with 'Char'
Expected type: [String] -> Char
  Actual type: [String] -> String
In the first argument of 'map', namely 'printR'
...

なぜこれが起こるのか誰か知っていますか?

4

2 に答える 2

5
Prelude> :type (:)
(:) :: a -> [a] -> [a]

これは、(:)関数が左側に 1 つの項目を受け取り、右側にリストを受け取ることを示しています。与えられた:

a :: t
b :: t
c :: [t],

a:b:c式のタイプが であるa:(b:c)ため、これは機能します。一方、parses asは、型が正しくないため機能しません:は typeである必要がありますが、実際には type である必要があり、実際には typeである必要がありますが、実際には typeです。あなたの例では、です。b:c[t]b:c:ab:(c:a)c:aa[t]tct[t]tChar

リストの末尾に 1 つの項目を追加する場合は、 concatenate を使用できます(++)

xs ++ [i]

于 2013-09-29T17:54:30.820 に答える
3

演算子:は、要素をリストの先頭に追加するために使用されます。あなたの表現に

sl:(printH header):sl:(map printR t)

最初の 3 つの式 ( slprintH headerおよびsl) はリスト要素 (明らかに文字列) ですが、4 番目の式 ( map printR t) はそれらを先頭に追加するリストです。

リストに要素を追加する場合、 operator は使用できません:。次のようなものを使用する必要があります。

sl:(printH header):sl:(map printR t) ++ [sl]
于 2013-09-29T17:54:20.037 に答える