gpt4 book ai didi

haskell - Haskell 中的嵌套列表追加

转载 作者:行者123 更新时间:2023-12-01 23:00:28 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,将给定的值附加到嵌套列表结构的最里面的列表中,但是当我什至不确定这样一个函数的类型签名是什么时,我遇到了类型错误.

digpend a xs = case xs of [_:_] -> map (digpend a) xs
[[]] -> [[a]]
xs -> a:xs

例如,
digpend 555 [ [ [ 5,1,-12,33 ] , [ 6,22 ] ] , [ [ -9,0,9,12,83 ] ] ]

应该回来
[ [ [ 555,5,1,-12,33 ] , [ 555,6,22 ] ] , [ [ 555,-9,0,9,12,83 ] ] ]

理想情况下,它可以通过递归在任何级别的嵌套上工作。这是允许的吗?

最佳答案

这是一个不完全令人满意的实现,使用类型类:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

class DigPend a b where
digpend :: a -> [b] -> [b]

instance DigPend a a where
digpend x xs = (x:xs)

instance (DigPend a b) => (DigPend a [b]) where
digpend x xs = map (digpend x) xs

只要完全指定参数的类型,它就可以很好地工作:
*Main> digpend (5 :: Int) ([6,7,8] :: [Int])
[5,6,7,8]
*Main> digpend (555 :: Int) ([[[5,1,-12,33],[6,22]],[[-9,0,9,12,83]]] :: [[[Int]]])
[[[555,5,1,-12,33],[555,6,22]],[[555,-9,0,9,12,83]]]
*Main> digpend (5 :: Int) ([] :: [Int])
[5]
*Main> digpend (5 :: Int) ([] :: [[Int]])
[]

但是,像 digpend 5 [6,7,8] 这样的调用触发大量“歧义类型变量”错误——一个数字文字,如 5是多态的(它可以存在于 Num 的任何实例中),而 ghci通常会很乐意默认为 Integer ,它首先尝试解决 DigPend 的类型类约束。 ,在那个阶段,没有足够的类型信息让它知道 digpend 的哪个实例申请。

关于haskell - Haskell 中的嵌套列表追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17368919/

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