Haskell 保留具有特定条件的列表元素,推断类型不够通用
我试图从列表中保留大于或等于i、小于或等于j的数字、字符、字符串、布尔值等。我也不想更改Int->Int->[u]->[u]的初始定义,例如:Haskell 保留具有特定条件的列表元素,推断类型不够通用,haskell,Haskell,我试图从列表中保留大于或等于i、小于或等于j的数字、字符、字符串、布尔值等。我也不想更改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)
>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]
这是我想到的
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)
问题是您使用Int进行比较,因此在这种情况下u也必须是Int。或者你可以让i和j更通用。此外,您不需要两个呼叫来筛选。您可以按如下方式实现fromTo
fromTo :: Ord a => a -> a -> [a] -> [a]
fromTo i j = filter (\x -> i <= x && x <= j)
您如何定义Int值与任意类型的比较?您不能编写这种类型的函数来实现这一点,因此您必须以某种方式对其进行更改。也许是用一个提供比较方法的typeclass来约束u。你的意思是:只给出数字的列表,。。。指数大于或等于i。。。?
fromTo :: Ord a => a -> a -> [a] -> [a]
fromTo i j = filter (\x -> i <= x && x <= j)
fromTo (-4) 50 [0, 25..100]
[0,25,50]
fromTo 'c' 'x' ['a'..'z']
"cdefghijklmnopqrstuvwx"