2016-07-08 5 views
1

私は、次の学期に向けて自分自身を準備するためにHaskellを勉強し始めました(実際には、前期の学期中に落としました)。私が実際に見ている主題はリストです。cons8という非常に単純な関数を書くのには助けが必要です。これはリストである引数を受け取り、そのリストの先頭に8を追加します。私の問題は、関数の引数としてリストを含める方法と関数の本体でそれを参照する方法について固執していることです。私は次のように型を定義し、その関数を書くことができることを推測:リストを引数として受け入れる関数を書く

cons8 :: [a] -> [a] 

私は非常に私の問題を解決するためにあなたの助けに感謝します。

+0

あなたの型署名は、 'cons8'はどんな型のリストでも動作することを示唆していますが、' 8'をリストに入れたい場合は、数字のリストでなければなりません。 – sepp2k

+0

これはおそらく重複していますが、とにかく簡単な答えです:パターンマッチする2つの定義を下に置く必要があります。空リストと非2行の定義を1つ入れます: 'cons8 [] = )、cons8(x:xs)=(空でない場合、xパターンは頭に一致し、タイプa、リストの残りの部分にxs、タイプ[a]) 'である。 「cons8」は空のケースは必要ありませんが、私はあなたがなぜ頭を操作するのではなく、リスト自体で何かをやっているのを見ることができれば幸いです。 –

+0

また、簡単な1つの答えは、中置機能を利用するために接頭辞関数を接頭辞に変換することです(私はそれが正しい用語だと思います)。 'cons8 =(:) 8' –

答えて

6

まず、タイプから始めて、実際に開始するのが良い方法です。

のタイプをチェックしてみましょう:ここ

cons8 :: [a] -> [a] 

を、aはどのタイプにすることができます。上記の型は、呼び出し元が任意のリストでcons8を使用できることを約束しています:整数のリスト、文字のリスト、ブール値のリストなど.8を前に置いて、同じタイプの値をリストしたいので、上記のタイプはあまり一般的ではありません。あまり一般的でないものを使用しましょう。

cons8 :: [Int] -> [Int] 

ここで、リスト引数を取る方法。これは重要です:あなたは他の引数としてリスト引数を取る。

cons8 x = ???? -- TODO 

よくある間違いは、リストであるのでcons8 [n] = ...と書いてください。それをしないでください! [n]はリストですが、1つの要素(n)のみを持つリストは非常に特殊なものです。 1要素のリストのみを扱いたいとは思わないので、cons8のいずれかのリストと一緒に働きたい。したがって、中括弧はありません。xをリスト全体の引数にしてください。もちろん

cons8 x = 8 : x 

は、我々は他の名前、例えばにxの名前を変更することができます

その後、私たちは短所演算子を適用することができます

cons8 list = 8 : list 

でも動作します。あなたはHaskellで出世すると、あなたはおそらく

セクションについて学び、そして次のコードを実際に

cons8 = (8 :) 

を好むだろう、(8 :)あなたは通常cons8関数を定義回避し、直接使用することをとても短く、その定義。

+2

マイナーなスタイルの点だけですが、それはリストであることを示すために 'cons8 xs = 8:xs'を使用します –

+0

大きな説明。私は非常に素晴らしいです。 – user3059248

関連する問題