2016-09-11 13 views
1

私はハスケルの世界ではかなり新しいです。私はオンラインでhttp://learnyouahaskell.comを読んでいましたが、パターンマッチングセクションに関する細かいことは理解できませんでした。私は パターンx:文字列のxs

ような
myFunc' (firstLetter:_) = "Hello" ++firstLetter 

何かをする場合、私は

Couldn't match type ‘Char’ with ‘[Char]’ 
     Expected type: [[Char]] 
     Actual type: [Char] 

この関数を呼び出すときしかし、私は次のエラーを与え、それらの機能

myFunc' (firstLetter:_) = firstLetter -- returns firstLetter of given string 

を書かれている。しかし、私はこのように機能を変更した場合

myFunc' (firstLetter:_) = "Hello" ++ [firstLetter] 

この関数を呼び出すとうまく動作します。なぜ私は他の場合に括弧が必要なのだろうと思っていた。実際に何がfirstLetterです。

答えて

4

まず、あなたがGHCiの中(++)の種類をチェックすると、あなたが得ます。

同様のは、(:)が何をするか見てみましょう:

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

ので(:)の最初の引数は、すべてのリストである必要はありません。 a == Charを修正すると、実際には(:) :: Char -> String -> Stringとなります。

我々は関数headStr(リコールString == [Char])を定義することができる:

headStr :: String -> Char 
headStr (x:_) = x 
headStr _ = error "Empty string!" 

なお起因この場合x :: Char(:)のタイプ。一方

我々が定義しようとします

hello :: String -> String 
hello (x:_) = "Hello" ++ x 
hello _ = error "Empty string!" 

を、それ以外のエラーの場合には、我々は[Char] ++ Charを得るために型チェックしません。ghciが役に立ちましたので、(++)の2番目の引数は常にリストでなければならず、この場合、最初の引数が[Char]であるため、[Char]でなければなりません。

hello' :: String -> String 
hello' (x:_) = "Hello" ++ [x] 
hello' _ = error "Empty string!" 

と予想されるので、これは動作します:あなた自身に気づいたよう

は、このリストにxをラップすることによって固定することができます。

4
"Hello ++ firstLetter 

種類があります:あなたが見ることができるように、それが不可能である

[Char] ++ Char 

[Char]Charを追加することはできません。それらは異なる種類です!

しかし、あなたは1つの要素、firstLetterのリストを作成している

[firstLetter] 

を行うこともできます。 firstLetterCharなので、Charのリストが表示されます。リストのタイプは[Char]です。

同じタイプの2つのリストを追加することができます。そのため、2番目のケースで動作します。それは引数としてのの二つのリストを取る意味

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

+0

こんにちはRakete1111、ご意見ありがとうございます。もうちょっとしたことを確認するためのもう少し小さな実験がありました。あなたはcharに[Char]を追加することはできないと言いました。しかし、ghci( 'c': "dfg")でこの行を実行すると有効です。つまり、(++)演算子には同じ型が必要です。 –

+0

@ CanEldemまあ、技術的には、はい。 'c'の型は' 'dfg''の中の要素の型、つまり' 'Char''であるため、あなたは' 'Line''です。 '" c ":" dfg "'は無効です。 – Rakete1111

関連する問題