我有這個開發的函式,可以顯示您選擇的范圍中 2 的冪:
import Data.Bits(Bits, (.&.))
isPower2 :: (Bits i, Integral i) => i -> Bool
isPower2 n = n .&. (n-1) == 0
這很有效,但我只需要從所選范圍的賠率中過濾 2 的冪,例如:
filter isPower2 [0 .. 1000]
[0,1,2,4,8,16,32,64,128,256,512]
上面的這個輸入和輸出顯示了 0 到 1000 之間的所有冪,但我需要的只是賠率的冪,所以我需要的輸出是:
[2,8,32,128,512]
有沒有辦法過濾這個只指向賠率的函式?謝謝。
uj5u.com熱心網友回復:
我建議首先撰寫一個函式來檢查 2 的冪是否是 2 的奇次冪。
power2isOddPower2 :: (Bits i, Integral i) => i -> Bool
也許首先考慮如何針對具體情況執行此操作Word8,然后將其推廣到任意正整數。
然后,您可以將其與檢查任意數字是否為 2 的奇次冪的謂詞結合使用,并將其用于過濾:
filter (\n -> isPower2 n && power2isOddPower2 n) [0 .. 1000]
uj5u.com熱心網友回復:
這是一種用于檢查數字是否為 2 的冪的聰明演算法。但不幸的是,它不太適合這種進一步的分析。所以我將提出一種稍微不同的技術。讓我們把問題分成幾部分。Haskell 有一個叫做 power 的函式(^)(實際上,它有三個略有不同的函式,但就我們的目的而言,最簡單的一個就可以了)。因此,讓我們從獲得兩個的所有冪開始。是的,所有這些。
> map (2 ^) [0..]
[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,...]
這是一個無限串列,Haskell 對此沒有任何問題。如果你在 GHCi 中運行它,你需要按 Ctrl C 來阻止它永遠輸出。
現在我們想要取小于某個限制的那些。
> takeWhile (< 1000) $ map (2 ^) [0..]
[1,2,4,8,16,32,64,128,256,512]
takeWhile是一個函式,顧名思義,一旦條件為假就停止。就像filter,但是一旦遇到一個錯誤值,它filter就會完全停止(永遠不會在無限串列上終止,因為它堅持檢查每個值)。
所以現在我們有一種方法可以獲取您在 OP 中的串列。但我們從權力 ( [0..]) 開始。所以如果我們想過濾一些權力,我們可以在filter右手邊添加一個
> takeWhile (< 1000) . map (2 ^) . filter (\x -> x `mod` 2 == 1) $ [0..]
[2,8,32,128,512]
當然,我們希望將其拆分為幾個輔助函式(isOdd例如,很容易將其分解為where子句),因為它自己變得有點長。但這是基本的想法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359147.html
標籤:哈斯克尔
下一篇:Haskell少輸入測驗樣板
