我需要编写一个Haskell函数采用一个String
,s
和Integer
,i
,然后进行i
正确的旋转s
。
rotate :: String -> Integer -> String
我已经成功地使用了它,String -> Int -> String
但是被要求去做Integer
这就是我实现的Int
:
rotate str n = take (length str) $ drop (negate n `mod` length str) $ cycle str
问题是drop :: Int -> [a] -> [a]
将Int
as作为类型参数。此外length :: Foldable f => f a -> Int
,例如产生一个Int
。这样就行不通了。
但是,存在适用于Integral
类型的通用变体,Num
例如genericDrop :: Integral i => i -> [a] -> [a]
和genericLength :: Num i => [a] -> i
:
import Data.List(genericDrop, genericLength, genericTake)
rotate :: Integral i => [a] -> i -> [a]
rotate str n = genericTake l (genericDrop ((-n) `mod` l) (cycle str))
where l = genericLength str
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句