簡體   English   中英

Haskell 中無限列表的元素

[英]Element of an infinite list in Haskell

我正在用 Haskell 編寫一個字符編碼器。 對於我的評估,我不允許使用任何內置函數,例如elem等我的一個函數稱為 int_to_char,它將整數轉換為我正在考慮使用無限列表的字符,[ 1 , 2 .. ] 連續字符數的無限列表 所以我的問題是你能做一個無限的字符列表嗎? 你能找到無限列表的元素嗎? 這可能是肯定的,有沒有更簡單的方法來做到這一點而沒有內置函數!

編輯:我更新的代碼用於最多 9 個字符的字符編碼,但是,我正在嘗試為長度超過 9 的字符制作編碼器,例如 aaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbb 等。我不是在尋找解決方案,只是一個解釋最好的方法是什么

int_to_char :: Integer -> Char
int_to_char 0 = '0'
int_to_char 1 = '1'
int_to_char 2 = '2'
int_to_char 3 = '3'
int_to_char 4 = '4'
int_to_char 5 = '5'
int_to_char 6 = '6'
int_to_char 7 = '7'
int_to_char 8 = '8'
int_to_char 9 = '9'
int_to_char x = error "Number must be between 0 and 9"

length_char :: Char -> String -> Integer
length_char c [] = 0
length_char c (x:xs)
    | (c == x ) = 1 + length_char c xs
    | otherwise = 0 + length_char c []

drop_char :: Char -> String -> String
drop_char c [] = []
drop_char c (x:xs)
    | (c == x)  = drop_char c xs
    | otherwise = (x:xs) ++ drop_char c []  


encode :: String -> String
encode [] = []
encode (x:xs) = x : (int_to_char(length_char x (x:xs))) : encode 
(drop_char x xs)  

你能做一個無限的字符列表嗎?

所問問題的答案是肯定的,這是一個簡單的例子:

infinitelyManyAs :: [Char]
infinitelyManyAs = 'A' : infinitelyManyAs

但我懷疑這個問題的意圖是按某種順序獲得所有字符的有限字符列表。 這里有一些提示:

  • 您可以使用與用於數字相同的列表枚舉語法,但使用字符代替數字。 例如, ['a','b'..]是列表Char acters。
  • CharBounded一個實例,因此最小和最大字符分別有minBoundmaxBound 但也許這算作“內置'函數'”並且不能使用,我不知道。
  • 除了通常的字符文字格式,還有數字字符文字格式; 例如, 'a''\\97''\\x61''\\o141'都代表同一個字符。

你能找到無限列表的元素嗎?

是的,有很多方法。 為了練習 Haskell,我建議編寫一個遍歷無限列表的遞歸函數,盡管有經驗的 Haskeller 可能更喜歡先創建(或重用)一些基本的列表處理函數,然后將它們鏈接在一起。 (列表推導式將被考慮並丟棄,因為它們無法以理智的方式報告無限列表的失敗。)

暫無
暫無

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

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