2017-01-13 11 views
2

私はまだHaskellの初心者ですが、現在私は無限リストを生成するための関数を作成しようとしています(10例えば、)最初の10の数字を取る。これは与えられた別のリストで割り切れる。私はしかし、私は常に、実際と予想されるタイプ 『ブール』と一致しませんでした」エラーを取得し、再帰を通してそれを解決しようとしているということであるあなたが通知を持っているようHaskell - 与えられたリストのすべての数で割り切れる無限リスト

myCode :: [Int] -> [Int] 
myCode (a:as) = [ x | x <- [0..] , x `mod` a == 0 , x `mod` myCode as ==0] 

:ここ

が私の考えです'[Int]'と入力してください。 私はこの特定の問題を解決する他の方法がわからないので、少し紛失しています。

+0

これらは、指定されたリストの* all *要素で除算可能である必要がありますか? –

+0

この再帰が何を達成することを望みますか?一度動作すると関数が出力するべきいくつかの出力例を与えてください! – leftaroundabout

+0

それは申し訳ありませんが、それらは与えられたリストの任意の数で割り切れるすべての数字でなければなりません。例えば、5(myCode [2,5])はリスト[2,4,5,6,8]を得ます。 – Fapprentice

答えて

3

ここで再帰を使用する必要はありません:

alldiv :: [Int] -> Int -> Bool 
alldiv l b = all ((==) 0 . mod b) l 

あるいはmyCodeにローカルにそれを添付:あなたはalldivには書き換えることができ

alldiv :: [Int] -> Int -> Bool 
alldiv l b = all (\n -> b `mod` n == 0) l 

myCode :: [Int] -> [Int] 
myCode as = [ x | x <- [0..] , alldiv as x] 

単に条件として all(または any)を使用します
myCode :: [Int] -> [Int] 
myCode as = [ x | x <- [0..] , alldiv x] 
    where alldiv b = all ((==) 0 . mod b) as 

最後にyo

myCode :: [Int] -> [Int] 
myCode as = filter alldiv [0..] 
    where alldiv b = all ((==) 0 . mod b) as 

EDIT

リスト内の1つの要素が周器である、あなただけanyallを交換する必要があることに十分であるので:Uはあなたが単にfilterを使用することができ、リストの内包は必要ありません。

+0

あなたは非常にあなたの助けを借りていますが、この場合、私は数値で割り切れるすべての数値を探していますが、リストのすべての数値が4(myCode [2,3])を取るわけではありません[2,3,4 、6]明確に指定していないのは申し訳ありません。 – Fapprentice

+0

あなたのコメンテントを通して、私はまだ研究しなければならない多くの機能を学びました:) – Fapprentice

+0

@HenrikBaumann @HenrikBaumann:その場合、単に 'all'を' any'に置き換える必要があります。 –

関連する問題