Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 保留具有特定条件的列表元素,推断类型不够通用_Haskell - Fatal编程技术网

Haskell 保留具有特定条件的列表元素,推断类型不够通用

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)

我试图从列表中保留大于或等于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) 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"