我试图获取此代码:
intersperse ',' $ show 123
集成到此功能中:
printListTuples listTuple = unlines [ ys ++ " " ++ unwords (map show x) | (x, ys) <- listTuple ]
此示例中x可以等于123。
因此代码应该输出一个字符串,如下所示: &#34; 1,2,3&#34;
而不仅仅是&#34; 1 2 3&#34;像这个代码目前一样。
我一直在尝试“#34; map&#34; &#34;穿插&#34;并且&#34;显示&#34;到函数中的x。有什么建议吗?
编辑:
例如,我尝试使用
printListTuples listTuple = unlines [ ys ++ " " ++ unwords (map intersperse ',' $ show x) | (x, ys) <- listTuple ]
但这会返回错误:
Couldn't match expected type ‘String -> [String]’
with actual type ‘[[a0] -> [a0]]’
The first argument of ($) takes one argument,
but its type ‘[[a0] -> [a0]]’ has none
In the first argument of ‘unwords’, namely
‘(map intersperse ',' $ show x)’
In the second argument of ‘(++)’, namely
‘unwords (map intersperse ',' $ show x)’
Couldn't match expected type ‘[a0]’ with actual type ‘Char’
In the second argument of ‘map’, namely ‘','’
In the expression: map intersperse ','
In the first argument of ‘unwords’, namely
‘(map intersperse ',' $ show x)’
我不太了解修复。
答案 0 :(得分:5)
尽量避免编写复杂的表达式。您可以使用header('X-Frame-Options: GOFORIT');
和let
子句创建中间定义。然后用较小的,经过测试的表达式构建你的最终表达式。
例如,您已经确定了一个有用的表达式:
where
所以创建一个封装它的定义:
intersperse ',' $ show x
然后你可以问ghci它的签名:
commify x = intersperse ',' (show x)
接下来,解决只打印一个元组的问题:
ghci> :t commify
commify :: Show a => a -> String
一旦您完成了工作,您的printTuple (x,ys) = ys ++ " " ++ ...
功能就是:
printListTuple
易于阅读和理解。
答案 1 :(得分:3)
让我们看看第一个错误:
Couldn't match expected type ‘String -> [String]’
with actual type ‘[[a0] -> [a0]]’
The first argument of ($) takes one argument,
but its type ‘[[a0] -> [a0]]’ has none
In the first argument of ‘unwords’, namely
‘(map intersperse ',' $ show x)’
“($)
的第一个参数接受一个参数” - 这意味着它应该是一个函数,因为它的类型显示:
GHCi> :t ($)
($) :: (a -> b) -> a -> b
然而, map intersperse ','
不是一个功能。当您将两个参数传递给map
时,它将是一个列表......
GHCi> :t map
map :: (a -> b) -> [a] -> [b]
...但是,map intersperse ','
输入错误:','
不是列表,因此您无法使用map
在其上映射函数(这是另一个错误)说的)。问题的根源在于您不需要map
将intersperse ','
应用于String
:
GHCi> :t intersperse ','
intersperse ',' :: [Char] -> [Char]
这将解决这两个错误......并引入另一个错误:
GHCi> let printListTuples listTuple = unlines [ ys ++ " " ++ unwords (intersperse ',' $ show x) | (x, ys) <- listTuple ]
<interactive>:33:66:
Couldn't match type ‘Char’ with ‘[Char]’
Expected type: [String]
Actual type: [Char]
In the first argument of ‘unwords’, namely
‘(intersperse ',' $ show x)’
In the second argument of ‘(++)’, namely
‘unwords (intersperse ',' $ show x)’
In the second argument of ‘(++)’, namely
‘" " ++ unwords (intersperse ',' $ show x)’
现在unwords
想要一个String
的列表,但我们正在给它intersperse ',' $ show x
,这是Char
的列表(即{{1} }})。这引导我们注意这样一个事实:我们不再需要String
:它只用于在数字之间放置一个空格,但现在我们想要用逗号而不是空格,我们已经这样做了与unwords
。所以我们要做的就是删除它:
intersperse
Etvoilà:
GHCi> let printListTuples listTuple = unlines [ ys ++ " " ++ (intersperse ',' $ show x) | (x, ys) <- listTuple ]
从这里开始,您应该将您的功能分解为更小的部分,正如user5402在答案中所建议的那样。