2017-03-27 4 views
0

iより大きいか等しく、j以下である数字、文字、文字列、boolなどのリストから除外しようとしている。私はまた、INT-の私の最初の定義を変更したくない>のInt - > [U] - > [U]、いくつかの例:特定の条件を持つリストの要素を保持する、推論された型は一般的ではない

ここ
>fromTo 3 7 [1..10] 
    [3,4,5,6,7] 
    >fromTo 1600 1600 [0..] 
    [1599] 
    > fromTo (-4) (-3) [False,True] 
    [] 
    >fromTo 12 20 "Haskell" 
    "" 
    >fromTo (-4) 6 [0, 25..] 
    [0,25,50,75,100,125] 

iは

fromTo :: Int->Int->[u]->[u]       
fromTo i j list = filter2 i j (filter (\e1 -> e1>= i) list)  

filter2::Int->Int->[u]->[u] 
filter2 y x filteredI = (filter (\e2 -> e2<= x) filteredI) 

思い付いたものとされエラーメッセージは次のとおりです。

- Inferred type is not general enough 
*** Expression : filter2 
*** Expected type : Int -> Int -> [a] -> [a] 
*** Inferred type : Int -> Int -> [Int] -> [Int] 
+4

fromTo :: Ord a => a -> a -> [a] -> [a] fromTo i j = filter (\x -> i <= x && x <= j) 

を次のようにfromToを実装するだろうか? – karakfa

+0

これを行うタイプの関数を書くことはできないので、何らかの形でそれを変更する必要があります。おそらく、比較メソッドを提供するtypeclassを使って 'u'を制約することによって可能になります。 –

+0

あなたは意味しましたか?数字だけが与えられたリスト、それは**インデックスがあります**より大きいか等しい "i" ...? – Franky

答えて

0

問題はuはまた、その際にIntでなければならないので、あなたは、比較することIntを使用しているということです。または、ijをより一般的にすることができます。また、filterを2回呼び出す必要はありません。どのようにあなたは、任意のタイプでのInt値の比較を定義します、その後

fromTo (-4) 50 [0, 25..100] 
[0,25,50] 

fromTo 'c' 'x' ['a'..'z'] 
"cdefghijklmnopqrstuvwx" 
関連する問題