使用散布和展示

时间:2015-09-26 02:11:21

标签: haskell

我试图获取此代码:

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)’

我不太了解修复。

2 个答案:

答案 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在其上映射函数(这是另一个错误)说的)。问题的根源在于您不需要mapintersperse ','应用于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在答案中所建议的那样。