gpt4 book ai didi

haskell - 用字符串映射行为

转载 作者:行者123 更新时间:2023-12-02 16:26:06 26 4
gpt4 key购买 nike

假设 map 是:

map :: (a -> b) -> [a] -> [b]

为什么R.map(R.toUpper, 'hello')返回['H', 'E', 'L', 'L', 'O'] code> 而不是 "HELLO"

例如,在 haskell 中,字符串是字符列表,因此 map toUpper "hello" 的行为符合预期 (HELLO)。

Ramda 的 map 不应该做同样的事情吗?

<小时/>

这可能是一个设计选择,但我认为 Ramda 的 map 可能违反了仿函数定律:如果我们将 id 函数映射到仿函数上,我们将无法取回原始仿函数

console.log(
R.map(R.identity, 'Hello World'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>

为什么我不期望 map 的行为更像:

const map = (fn, string) => string.replace(/./g, fn);


console.log(
map(R.toUpper, 'hello world'),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>

最佳答案

正如评论所说,字符串不是 functors 。仿函数定律要求

map :: Functor f => (a -> b) -> f a -> f b

也就是说,对于持有 a 类型的一个或多个项目以及从类型 a 到类型 b 的函数的仿函数,它将返回一个相同类型的仿函数,其中包含 b 类型的一个或多个项目。字符串不能做到这一点,因为它只包含字符。例如,您希望 map(_ => 1.234, "hello") 返回什么?

Ramda 在字符串上的行为不是故意的。正如伯吉所建议的那样,它只是脱离了实现。字符串看起来非常像数组(具有整数 length 属性和整数索引子元素),因此代码将它们视为数组。

Ramda 一直打算成为一个低级库,并且创始人对编写手持代码并不是特别感兴趣。如果您提供所需的类型,它应该按照广告中的方式工作,但如果您不提供,则几乎没有保证。但是,如果您对此有强烈的感受,请随时raise an issue与 Ramda 团队联系,或者更好,raise a pull request与您喜欢的行为。它可能不会被接受,但会得到公平的听证会。

关于haskell - 用字符串映射行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222175/

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