2013-08-19 13 views
8

2番目の例で期待したように、短所はうまくいかないようです。私は何が欠けていますか?ハスケルでコンスはどのように働くのですか:

ここでconsは要素をリストに追加します。これは素晴らしいことです。

1:[2,3] 

しかし、このいずれかで、リストXSにリストxとテールに最初の要素を入れているようだ:、これが起こるだろう、なぜ私は本当に見ていない

let { myInt :: [Int] -> [Int] ; myInt (x:xs) = xs } 

それはに何かあります再帰を行う?

ありがとうございます!

+2

それはそのhaskell98を覚えてうれしいですができます「':'」で始めなければなりません*中置*型コンストラクタ、(二つの引数を取る)リストの短所コンストラクタは、この一般的なルールの少し特殊なケースであるので、。 – jberryman

答えて

11

:オペレータは、構築リストと両方に使用することができるにリストを分解、どこで使用するかによって異なります。あなたが式でそれを使うならば、それはあなたが言ったように、リストを構築するために使われます。あなたがパターンでそれを使うと、それは逆を行います - それはリストを解体します。

リストの構築:

λ> 1:2:[3, 4] 
[1,2,3,4] 

リストを解体:


同じ

λ> let first:second:rest = [1, 2, 3, 4] 
λ> first 
1 
λ> second 
2 
λ> rest 
[3, 4] 
はHaskellでは、多くのデータ構築のために適用されます。 Justを使用して Maybe値を構成することができます。

λ> let name = Just "John" 
λ> :type name 
name :: Maybe [Char] 

ただし、Maybeという値を使用することもできます。

λ> let Just x = name 
λ> x 
"John" 
+0

ここでは ':'については特別なものは何もないことに注意してください。 _all_値コンストラクタはこのプロパティを持ちます。 – MathematicalOrchid

9

ここでは2つの異なることが起こっています。最初の例では、(:)演算子を使用して、要素1とリスト[2,3]から新しいリストを作成します。

1:[2,3] 

あなたの第二の例は、をマッチングパターンを使用しています。表現...

myInt (x:xs) = ... 

は...基本的に「myIntの引数は(おそらく空の)リストの前に追加の要素で構成されている場合は、その後の最初の要素xとリストxsを呼びましょう。」と言います入力リストは、少なくとも一つの要素が含まれている場合にのみ動作すること

λ> let { myInt :: [Int] -> String ; myInt (x:xs) = "The first element is " ++ show x ++ " and the rest of the list is " ++ show xs} 
λ> myInt [1,2,3] 
"The first element is 1 and the rest of the list is [2,3]" 

注:この例は明確に行うことができます。

λ> myInt [] 
"*** Exception: <interactive>:9:34-127: Non-exhaustive patterns in function myInt 

しかし、我々は、入力リストが、このような空である場合に扱うことができる:

λ> let { myInt :: [Int] -> String ; myInt (x:xs) = "The first element is " ++ show x ++ " and the rest of the list is " ++ show xs; myInt _ = "empty list"} 
λ> myInt [] 
"empty list"