我是 Haskell 編程的新手。我正在尋找!!運算子的實作,我需要使用它而不是 as[a] -> Int -> a或[a] -> Int -> [a]
as [a] -> Integer -> [a], or [a] -> Integer -> a。
我想使用它的一些代碼:
next x = 1: zipWith ( ) x (tail x) [1]
bins :: Integer -> [Integer]
bins n
| n < 0 = undefined
| otherwise = (( (foldr (:) [] $ unfoldr (\st->Just(st,next st)) [1]) !! n ))
而且我不能僅僅改變bins :: Integer -> [Integer]to 的型別,bins :: Int -> [Integer]
因為它在測驗中是一個嚴格的條件。
uj5u.com熱心網友回復:
你可以fromIntegral :: (Num b, Integral a) => a -> b像這樣呼叫它:
..... !! (fromIntegral n)
并保持您的型別簽名不變,因為Integer是一種Integral型別并且Int是Num.
在 GHCi 中,
> fromIntegral (1::Integer)::Int
1
it :: Int
> :i Integral
class (Real a, Enum a) => Integral a where
....
instance Integral Integer -- Defined in `GHC.Real'
instance Integral Int -- Defined in `GHC.Real'
> :i Num
class Num a where
....
instance Num Integer -- Defined in `GHC.Num'
instance Num Int -- Defined in `GHC.Num'
....
當然這會引入通常的整數環繞問題,
> maxBound :: Int
9223372036854775807
it :: Int
> (maxBound :: Int) 1
-9223372036854775808
it :: Int
> (fromIntegral (maxBound :: Int) :: Integer) 1
9223372036854775808
it :: Integer
> (fromIntegral (fromIntegral (maxBound :: Int) :: Integer) 1) :: Int
-9223372036854775808
但它可能是安全的假設,你不會真的如此高的指數值使用它,永遠。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386994.html
標籤:哈斯克尔
上一篇:如何操作Aeson值?
下一篇:Haskell中IORef的行為
