NuN*_*uNu 1 recursion haskell functional-programming
我正在编写一个Haskell函数,它递归地将整数i与元组列表进行比较.特别是,我想比较整数i每个a在(a,b)列表中.如果i < a然后打印出b与之对应的那个a
样本输入/输出
check 0.01 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = 'x'
check 0.4 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = 'y'
check 100 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = ' '
Run Code Online (Sandbox Code Playgroud)
我写了一个关于如何处理它的伪代码但是我在将该伪代码转换为实际的Haskell函数时遇到了麻烦.这是我到目前为止:
check :: a -> [(a,b)] -> b
check i (a,b):xs = tuples d xs
| if d <= a in (a,b) then = b //pseudocode
| id d !<= a in (a,b) then recursively check the next tuple //pseudocode
| otherwise ' ' // d is larger than all the a's of the tuple so return a space
Run Code Online (Sandbox Code Playgroud)
我相信我正在考虑它的方式是正确的,但我无法弄清楚如何遍历元组比较整数与元组i的as.有帮助吗?
有些要点需要注意:
您不能在同一个函数中返回类似的数字1和类似的字符' ',因为它们的类型不同.您可以做的是用来Maybe b返回Nothing您想要返回的地方' '以及Just 1您想要返回的地方1.
由于您正在对类型进行比较,a因此您需要a属于Ord类类.
所以修改后的程序就变成了
check :: (Ord a) => a -> [(a,b)] -> Maybe b
check d [] = Nothing
check d ((a,b):xs) | d <= a = Just b
| otherwise = check d xs
Run Code Online (Sandbox Code Playgroud)
尝试ghci中的函数给出
> check 0.01 [(0.25, 1),(0.50,2),(0.75,3)]
Just 1
> check 0.4 [(0.25, 1),(0.50,2),(0.75,3)]
Just 2
> check 100 [(0.25, 1),(0.50,2),(0.75,3)]
Nothing
Run Code Online (Sandbox Code Playgroud)
您也可以使用findfrom Data.List来编写具有类型的函数
find :: (a -> Bool) -> [a] -> Maybe a
Run Code Online (Sandbox Code Playgroud)
所以你的功能检查变成了
check2 :: (Ord a) => a -> [(a,b)] -> Maybe b
check2 a = fmap snd . find ((> a) . fst)
Run Code Online (Sandbox Code Playgroud)
(编辑)根据编辑的问题进行更改
check :: (Ord a) => a -> [(a,Char)] -> Char
check d [] = ' '
check d ((a,b):xs) | d <= a = b
| otherwise = check d xs
Run Code Online (Sandbox Code Playgroud)
为了能够使用,你也可以使用原来的检查功能fromMaybe,从Data.Maybe
newCheck :: Ord a => a -> [(a, Char)] -> Char
newCheck d xs = fromMaybe ' ' $ check d xs
Run Code Online (Sandbox Code Playgroud)