2

Learn you a Haskell for great good と 40 ページの as-patterns を読んでいます。

例を次のように少し変更しました。

firstLetter :: String -> String
firstLetter "" = "Empty string, oops"
firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] ++ " otherbit " ++ xs

次に、次のように使用できます。

*Main> firstLetter "Qwerty"
"The first letter of Qwerty is Q otherbit werty"

しかし、[x] と x の違いと、上記の例で [x] を使用しなければならない理由について混乱しました。

たとえば、私がに変更した場合

firstLetter :: String -> String
firstLetter "" = "Empty string, oops"
firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ x ++ " otherbit " ++ xs

エラーが発生します:

Couldn't match expected type `[Char]' with actual type `Char'
In the first argument of `(++)', namely `x'
In the second argument of `(++)', namely `x ++ " otherbit " ++ xs'
In the second argument of `(++)', namely
  `" is " ++ x ++ " otherbit " ++ xs'

xs印刷には使用できますが、 「Q」の印刷"werty"には使用する必要があります。[x]何故ですか?

とは[x]どういう意味ですか?

(x:xs) では、各:要素を区切るだけxで、最初の要素も同様です。を使用して印刷できないのはなぜxですか?

またxs、どのタイプですか?値のリスト? これはx要素でxsあり、リスト型でなければならないということですか?

4

4 に答える 4

6

++リストを連結するためのものです:

(++) :: [a] -> [a] -> [a]  

[x]はリストですが、リストでxはありません。

firstLetter (x:xs)パターンマッチングの例です。

(:) :: a -> [a] -> [a]  

この演算子は、リストの前に要素を追加します。
したがって、type ofxは要素で、type ofxsは要素のリストです。Haskell では、リストの名前に接尾辞 's' を追加するのが一般的です。

于 2013-04-03T09:04:42.783 に答える
5

Stringとして定義されtype String = [Char]ます。

"Qwerty"['Q', 'w', 'e', 'r', 't', 'y'];の省略形です。これは の省略形です'Q' : 'w' : 'e' : 'r' : 't' : 'y' : []

したがって、 と一致x : xsすると"Qwerty"、 と が得られx = 'Q'ますxs = "werty"

x     : xs
('Q') : ('w' : 'e' : 'r' : 't' : 'y' : [])

注:x = 'Q'ではありませんx = "Q"'Q'は aChar"Q"あり、a String(つまり a [Char]) です。しかし、あなたが持っていて'Q'、あなたが望むなら"Q"、あなたは書く['Q']こと"Q"ができます['Q'].

したがって、短い答えは、タイプを一致させるためにそれを行う必要があるということです。[x]は長さ 1 のリストで、その単一要素はxです。


これで:

firstLetter all@(x:xs)
    = "The first letter of " ++ all ++ " is " ++ x ++ " otherbit " ++ xs

を使用して印刷する文字列を作成しています++。それはタイプを持っています

(++) :: [a] -> [a] -> [a]

つまり++、2 つのリストを取り、リストを返します。

しかしx、リストではありません。したがって、型エラーが発生します。

代わりに使用します

"The first letter of " ++ all ++ " is " ++ [x] ++ " otherbit " ++ xs

これで、すべてのパラメーター++がリストになり、すべての型が一致します。

しかし、代わりに使用できます

"The first letter of " ++ all ++ " is " ++ x : " otherbit " ++ xs

の型:

(:) :: a -> [a] -> [a]
于 2013-04-03T09:02:36.937 に答える
3

[x] は「要素 x のみを含むリスト」を意味します。

Haskell の String は文字のリストであるため、x が文字 'Q' の場合、[x] は文字列 "Q" です。++ 演算子は引数として 2 つの文字列を受け取ることを想定しているため、文字だけを指定することはできません。

これは、コンパイラがあなたに伝えていることです:Couldn't match expected type `[Char]' with actual type `Char'コンパイラは [Char] 型 (String と同じ文字のリスト) の引数を期待していましたが、Char を渡していることを意味します。

于 2013-04-03T09:03:58.357 に答える
1

多くのプログラミング言語では、連結演算子がオーバーロードされて、両側の型に応じて複数の実装が存在するか、引数が文字列にキャストされることにも注意してください。これは、Haskell では当てはまりません。

于 2013-04-03T14:38:27.003 に答える