1

Haskell を使い始めたばかりで、整数と文字列を取り、整数が示す回数だけ文字列内の各文字を繰り返す小さな関数を実行したいと考えていました。

例: 「hello」を 3 倍すると、「hhheeelllooo」が出力されます。

私の問題は、すべての文字を反復処理する方法がわからないことです。

multiply::Int->String->String
multiply 1 s = s
multiply i s = multiply (i-1) (take 1 s ++ s)

だから私が得るのは「hhello」です。だから基本的に私は次のようなことをする必要があります:

mult::Int->String->String
mult 0 s = []
mult 1 s = s
mult i s = "iterate over s, take each char and call a modified version of the multiply method that only takes chars above"

助けてくれてありがとう

4

4 に答える 4

5

他の言語でループを使用する場合と同じ効果を得る方法はたくさんありますが、larsmans はmap. 別の一般的な方法は、再帰を使用することです。最初の文字をどうするかはすでにわかっているので、次のようにリストを再帰できます。

multiply n [] = []
multiply n (x:xs) = replicate n x ++ multiply n xs

larsmans がどのようにreplicate機能するかを説明しました。宿題として、 のようなライブラリ関数を使用することは想定されていないので、 の呼び出しを独自のバージョンreplicateに置き換えることができます。replicate

于 2013-04-30T09:42:42.643 に答える
4

モナドのリストの性質に基づく別の方法。
リストの各要素に関数を適用したいとします。
これを行うには、次のようにリストを関数に バインドするだけです

# "hello" >>= replicate 3

または、

# let f = flip (>>=) . replicate 

フリップを削除するには、

# let g = (=<<) . replicate
于 2013-04-30T15:39:20.773 に答える
1

これにはアプリカティブ ファンクターを使用できます。

import Control.Applicative

multiply n = (<* [1..n])

--- multiply 3 "hello" --> "hhheeellllllooo"
于 2013-05-01T12:39:37.063 に答える