在Haskell中你怎么能乘以一个字符串?

ben*_*ris 16 haskell

我正在尝试编写一个带a String和a的函数,Int并返回该字符串"int"次.那是:

duplicate :: String -> Int -> String
Run Code Online (Sandbox Code Playgroud)

如果我要写duplicate "Hello" 3输出应该是"HelloHelloHello".

Nik*_*kov 18

容易:

duplicate :: String -> Int -> String
duplicate string n = concat $ replicate n string
Run Code Online (Sandbox Code Playgroud)

$类型的函数(a -> b) -> a -> b.该语言允许使用非字母数字名称的函数以中缀形式(作为运算符)使用.即,上面函数的主体与下面的表达式完全相同:

($) concat (replicate n string)
Run Code Online (Sandbox Code Playgroud)

什么$只是让你摆脱大括号.这意味着上面的表达式只是以下表达式的替代:

concat (replicate n string)
Run Code Online (Sandbox Code Playgroud)

  • 您应该将`duplicate`的类型签名更改为`[a] - > Int - > [a]`.这样你就可以将它用于任何列表. (2认同)

Chr*_*lor 8

A String只是列表的同义词Char,列表类型是a Monad.因此

duplicate :: Int -> String -> String
duplicate n str = [1..n] >>= const str
Run Code Online (Sandbox Code Playgroud)

或者,如果你想获得所有无点

duplicate = (. const) . (>>=) . enumFromTo 1
Run Code Online (Sandbox Code Playgroud)

编辑

正如评论中所建议的那样

duplicate n str = [1..n] >> str
Run Code Online (Sandbox Code Playgroud)

要么

duplicate = (>>) . enumFromTo 1
Run Code Online (Sandbox Code Playgroud)


Aad*_*hah 5

你可以使用replicateconcat如下:

duplicate :: [a] -> Int -> [a]
duplicate = flip $ (concat .) . replicate

-- or as larsmans suggested:

duplicate :: [a] -> Int -> [a]
duplicate = (concat .) . flip replicate
Run Code Online (Sandbox Code Playgroud)

然后用它作为duplicate "Hello" 3.

  • 这是无意义风格的典型例子. (4认同)
  • 这是无意义无点的经典例子.你能一眼就看出为什么`(.)`在他们所在的地方?他们在做什么?为什么他们有必要?另一方面,`let(.:) = fat fmap fmap in concat.:flip replicate`是使用`fmap fmap fmap`或`(.).(.)`来组成函数的一个例子.两个论点.这是一个你可以在其他地方重用的习惯用法,而不仅仅是运行`pointfree`的输出. (3认同)