我正在尝试编写一个带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)
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)
你可以使用replicate和concat如下:
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.