【问题标题】:Haskell - non-numeric string as integerHaskell - 非数字字符串作为整数
【发布时间】:2018-09-29 23:30:53
【问题描述】:

我正在尝试将非数字字符串转换为整数,然后再转换回来。也就是说,我需要一种表示字符串的方法,例如“Hello world!”作为一个唯一的整数,然后可以将其转换回相同的字符串。但是,我不知道如何做到这一点,尤其是在 Haskell 中,这是一种我只使用了几周的语言。

谢谢。

【问题讨论】:

  • 这对 Stackoverflow 来说不是一个好问题。但是,如果你想要一个指针,请查看gödel numbering
  • 我猜普遍的问题是为什么你认为你需要这样做?
  • @AdamSmith 这可能是一个练习。
  • @AJFarmar 有点奇怪。 “用haskell把一个字符串变成一个唯一的数字?”人力资源管理系统。也许是“把一个字符串变成一系列字节”或者“序列化一个字符串”,甚至是“使用任何语言,设计一个算法,把一个字符序列变成一个唯一的数字”,但是这个具体的事情看起来像是一个 XY 问题。
  • @AdamSmith 你能仔细说说你认为“将字符串转换为唯一数字”和“序列化字符串”之间的区别吗?

标签: string haskell integer


【解决方案1】:

您可以使用 GHC 附带的标准库中包含的 readIntshowIntAtBase 来执行此任务。

Numeric> base = toInteger (fromEnum (maxBound :: Char)) + 1
Numeric> readInt base (const True) fromEnum "Hello, world!"
[(263317223602531232689798224281528500955719219481801413146983858530815311905,"")]
Numeric> showIntAtBase base toEnum 263317223602531232689798224281528500955719219481801413146983858530815311905 ""
"Hello, world!"

有一个小警告:您需要编写一个以某种方式处理空字符串的包装器——也许将其映射到-1,或者将所有其他答案提高1 或其他东西。不过,从好的方面来说,这对特殊的函数有一个你不需要的很好的属性,即每个(非负)整数都对应一个唯一的字符串。

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多