gpt4 book ai didi

haskell - 为什么 map 使用的这个函数需要返回一个(单例)列表而不是一个元素?

转载 作者:行者123 更新时间:2023-12-05 08:25:21 25 4
gpt4 key购买 nike

您可能已经猜到了,完全是初学者。我已经完成了“向你学习 Haskell”,但即使是基础知识我仍然在挣扎。

我正在看这个帖子 Split a number into its digits with Haskell有了这个函数,事情开始变得有意义了

digits :: Integer -> [Int]
digits n = map (\x -> read [x] :: Int) (show n)

丹尼尔问。

我知道 show 将我的输入数字作为字符串或字符列表返回,然后我可以使用 map 逐个元素地修改它。因此,作为 Char 的每个“x”由匿名函数选取并作为 Integer 读取,新列表由 map 组成,包含所有读取的整数。那么 read [x] 不应该是 read x 吗?为什么列表中的每个读取的 Char 都需要作为它自己的单例列表返回?在我看来,以这种方式调用 digits 123 应该返回 [[1],[2],[3]],因为无论如何 map 都会将所有内容组合到一个新列表中而不是 [1,2,3],因为它是正确的。但是为什么?

最佳答案

read :: Read a => String -> a适用于 String,而不适用于 Char,此处 xChar

确实,show n 构造了一个 String,它是一个 Char 的列表,因为 type String = [Char] 。如果我们对 Char 列表执行映射,则 x 是映射函数中的 Char。我们将其包装在一个单例列表中,以构造一个具有一个 Char 字符的 String,然后使用 read 将该字符串读取为一个 诠释

但是我们可以使用 digitToInt :: Char -> Int这可能更高效和优雅:

import Data.Char(<b>digitToInt</b>)

digits :: Integer -> [Int]
digits = map <b>digitToInt</b> . show

关于haskell - 为什么 map 使用的这个函数需要返回一个(单例)列表而不是一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66291162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com