2017-10-17 14 views
-2

私は2タプルのリストを持つ関数を実装しようとしており、それはTrueに対応するタプルを返します。最初の文字はストリングで、2番目の文字はブールです。これは私が欲しいものである:ここではタプルパターンマッチングリストHaskell

pack [ ("a", True), ("b", False), ("c", False), ("d", True) ] 
     returns [ ("a", True), ("d", True) ] 

は私のコードです:

pack :: [String] -> [Bool] -> [(String, Bool)] 
pack [] [] = [] 
pack (x:xs) [] = [] 
pack [] (y:ys) = [] 
pack (x:xs) (True:ys) = (x, True) : pack xs ys 
pack (x:xs) (False:ys) = pack xs ys 

私は{戻り、[( "A"、TRUE)、( "D"、TRUE)]}のみを得ることができます

pack ["a", "b", "c", "d"] [True, False, False, True] 

これは私が欲しいものではなく、これにアプローチする方法を混乱させます。どんな助け、指導、リンクも大変ありがとうございます。

+0

'パック=私はそれを使用するのが大好きだ4castle @フィルターsnd' – 4castle

+0

が、私はこれを行うにしようとしていますを使用しますHaskellの関数を使わずに – legoniko

答えて

2

私は、ソリューションに向けた自分のステップが何であるかを示すために実装しようとしていることの説明を使用します。うまくいけば、将来自分のソリューションに収束するのに役立ちます。私はそれを修正してください場合

、あなたは次のシグネチャを持つ関数たい:

pack :: [(String, Bool)] -> [(String, Bool)]

である、あなたは2つのタプルのリスト(Stringである第1の要素、である第2の要素を持っていますa Bool)、同じタイプのリストにしたいとします。

フィルタこのリストのすべてのタプルは、Trueの値を持つものだけを保持します。前奏曲は、ちょうどそのための機能を持つことが起こる:

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

filterの最初の引数を、関数a -> Bool述語と呼ばれ、あなたは第二引数(最初に保存しておきたいものを定義することができます[a])。私たちの目標署名にどんどん近づいて見て始めて

filter :: ((String, Bool) -> Bool) -> [(String, Bool)] -> [(String, Bool)]

aはまったくタイプが可能ですので、我々は(String, Bool)filteraを置き換えることができることを

注意以下の型を持っているでしょうpack!私たちが欠けていることは、我々が残しておきたいものをfilterを教えてくれる述語(String, Bool) -> Bool次のとおりです。

isTrue :: (String, Bool) -> Bool 
isTrue (_, True) = True 
isTrue (_, False) = False 

最後に、我々はfilterisTrueの用語でpackを実装できます。

pack :: [(String, Bool)] -> [(String, Bool)] 
pack = filter onlyTrue 

あなたがに言及しました「組み込み」関数を使用したくないというコメントです。さんはその後、filterを取り除くしようと、あなたが投稿したオリジナルのスタイルにpack近いの書き込み:

pack [] = [] 
pack (x:xs) 
    | isTrue x = x : pack xs 
    | otherwise = pack xs