gpt4 book ai didi

haskell - Haskell:换位在字符串列表上

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

Haskell的新手,到目前为止该语言很有趣。我希望能提供一个很好的提示,而不是一个答案,因为我喜欢Haskell带来的改变思想。

问题:我有一个字符串列表,我想转置它们。

let x = ["hello", "world"]

会成为
["hw", "eo", "lr", "ll", "od"]

到目前为止,我的情况是:
   transposeString :: [a] -> [a]
transposeString ([]:_) = []
transposeString x = (map head x) : transposeString (map tail x)

我绝对知道类型签名有问题。我的理由是
Let y = ["wow", "top"]
map head y

返回“wt”,因此将其递归到列表的其余部分是否可行?

预先感谢您的任何提示。

最佳答案

请注意,您不必提供类型签名:Haskell编译器可以派生一个。如果将实现保存在文件中:

transposeString ([]:_) = []
transposeString x = (map head x) : transposeString (map tail x)

并在 :t中使用 ghci查询类型,它返回:
*Main> :t transposeString 
transposeString :: [[b]] -> [[b]]

这很合理:
  • 您转置了一个矩阵,该矩阵是列表的列表。 [[b]]b元素列表的列表;和
  • 您可以自己从实现中派生它:map head x意味着x的元素必须是一个列表([b]),因为我们执行了映射,因此我们必须将列表嵌套一层,以便[[b]]tail也一样。

  • 据我所知,您的实现是正确的。您可以通过说 [b] ~ String来专门化它,从而为 String添加类型签名:
    transposeString :: [String] -> [String]
    transposeString ([]:_) = []
    transposeString x = (map head x) : transposeString (map tail x)

    再次有意义,因为 String ~ [Char]就是 b ~ Char。但是,专门化函数类型没有什么意义:您最好始终使用最通用的类​​型签名。在这种情况下为 [[b]] -> [[b]]

    关于haskell - Haskell:换位在字符串列表上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36962520/

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