我正在尝试编写一个将给定值附加到嵌套列表结构的最内层列表的函数,但是当我甚至不确定这样一个函数的类型签名是什么时,我会遇到类型错误.
digpend a xs = case xs of [_:_] -> map (digpend a) xs
[[]] -> [[a]]
xs -> a:xs
Run Code Online (Sandbox Code Playgroud)
例如,
digpend 555 [ [ [ 5,1,-12,33 ] , [ 6,22 ] ] , [ [ -9,0,9,12,83 ] ] ]
Run Code Online (Sandbox Code Playgroud)
应该回来
[ [ [ 555,5,1,-12,33 ] , [ 555,6,22 ] ] , [ [ 555,-9,0,9,12,83 ] ] ]
Run Code Online (Sandbox Code Playgroud)
理想情况下,它可以通过递归在任何级别的嵌套上工作.这是允许的吗?
这是一个使用类型类的不完全令人满意的实现:
{-# 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
Run Code Online (Sandbox Code Playgroud)
只要完全指定了参数的类型,它就可以正常工作:
*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]])
[]
Run Code Online (Sandbox Code Playgroud)
但是,调用digpend 5 [6,7,8]会触发大量"模糊类型变量"错误 - 数字文字就像5是多态的(它可以居住在任何实例中Num),虽然ghci通常很乐意默认Integer,但它首先尝试解决类型类约束DigPend,并且在那个阶段,没有足够的类型信息来知道应用哪个实例digpend.
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |