簡體   English   中英

Haskell - 改組不同類型的列表?

[英]Haskell - Shuffling a list with different types?

我是Haskell的新手,幾天前我開始學習Haskell的課程。 在這門課程中,有一項作業或作業,我現在仍然堅持。 我會很感激我的問題的提示和解釋,而不是完整的,完全的答案,因為這是家庭作業,因此我不想為其他人的工作贏得贊譽。

賦值是編寫一個shuffling函數( skyffla )。 實際的改組不是我需要幫助理解的,而是算法應該通過的測試之一。 我將用括號將算法標記到洗牌部分,以表示它不那么重要。

skyffla通過取第一個元素,第三個元素,第五個元素等等進行洗牌,直到獲取所有奇數索引,然后將它們附加到列表中。

此后,第一個列表中的其余元素應使用相同的方法處理,並附加到首次處理的列表中。 然后繼續,直到只剩下一個元素,然后最后將其附加到列表中。

如果我輸入:

skyffla [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

它會給我:

1: _[1, 3, 5, 7, 9, 11] ++ skyffla ([2, 4, 6, 8, 10, 12])_
2: _[1, 3, 5, 7, 9, 11] ++ [2, 6, 10] ++ skyffla ([4, 8, 12])_
3: _[1, 3, 5, 7, 9, 11, 2, 6, 10] ++ [4, 12] ++ skyffla([8])_ 
(4): _[1, 3, 5, 7, 9, 11, 2, 6, 10, 4, 12, 8]_

這正是我的代碼所做的,實際的改組正如預期的那樣工作。 但正如我所提到的,有一個測試我無法通過我當前的實現。)

因此,其中一項測試是天幕應采取: [3.4, 2.3, 5, 185, 23] 3.4,2.3,5,185,23 [3.4, 2.3, 5, 185, 23]並返回: _[3.4, 5, 23, 2.3, 185]_ 3.4,5,23,2.3,185 _[3.4, 5, 23, 2.3, 185]_

有了我的代碼,我得到: _[3.4, 5.0, 23.0, 2.3, 185.0]_

這是除了被所附的對5,185,23中的” 0.0"是正確的。

為什么是這樣?

我怎樣才能使“5.0”例如列為“5”?

我的代碼如下:

skyffla :: [a] -> [a]
skyffla [] = []
skyffla xs
    | length xs == 1 = xs
    | otherwise = dropUnevenElements xs ++ skyffla newList  where
    newList = takeUnevenElements xs

dropUnevenElements :: [a] -> [a]
dropUnevenElements [] = []
dropUnevenElements (x:y:xs) = x:dropUnevenElements xs
dropUnevenElements x = x


takeUnevenElements :: [a] -> [a]
takeUnevenElements [] = []
takeUnevenElements (x:y:xs) = y:takeUnevenElements xs 
takeUnevenElements x = []

答案是你的代碼是正確的。

當列表到達您的函數時,所有元素都已經是相同的類型

ghci> [3.4, 2.3, 5, 185, 23]
[3.4,2.3,5.0,185.0,23.0]

因為Haskell中的所有列表都是從一開始就是同類的。 (這里5被解釋為fromInteger 5 ,它將其轉換為其上下文中所需的任何類型)

如果您將輸出作為字符串進行比較,那么您將遇到此問題。 如果您將它們作為數字列表進行測試,則不是問題。

ghci> skyffla [3.4, 2.3, 5, 185, 23] == [3.4, 5, 23, 2.3, 185]
True

所以你真正面臨的是顯示問題。 Chris Martin建議使用Data.Decimal ,這是一種方法。 我的觀點是你沒有問題,你的代碼是正確的,而且是你需要改變的測試用例的處理。

聽起來你想要使用Decimal類型。

λ> import Data.Decimal

λ> [3.4, 5, 23, 2.3, 185] :: [Decimal]
[3.4,5,23,2.3,185]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM