私はシンプルな機能を持っており、ポイントフリーのスタイルを意識したいと思っています。この再帰関数をポイントフリーにすることはできますか?
shout :: String -> String
shout input
| null input = []
| otherwise = (toUpper . head $ input) : (shout . tail $ input)
私の直感は
コンスセルの最初の引数が期待されるタイプ「文字列と一致しない可能性があるため、次の文句を言っているこの
pfShout :: String -> String pfShout = (toUpper . head) : (shout . tail)
に私を導きました - >文字列 ' 実際の型' [[Char] - > Char] '
考えられる原因:多すぎる引数に '(:)'が適用されます
式の(toUpper。ヘッド): 'pfShout' の式(pfShout尾)
: pfShout =(TOUPPERヘッド):(pfShout尾)
及び第二のために、この不満短所の引数は、セル
予想と一致しませんでしタイプ '[[シャア] - >チャー]' 実際の型と '[シャア] - >文字列'
- pfShout '「のための式(pfShout尾)
考えられる原因は: '(。)' '(:)'、すなわち「(pfShoutの第2引数での少なすぎる引数
適用されます。 pfShout =(TOUPPERヘッド):(pfShout尾)
式において
。:(TOUPPER頭)。' 尾部) 「[ - >チャー[シャア]]」、と私は得るために始めている機能と - 「>文字列文字列」
それは私が外のリストを作ることができないことを私に明らかです私が思っている場所には、これはちょうどポイントフリーでは動作しません。
私はここに他の考慮事項があることを理解しています(今はベースケースがないようですが)。私はまた、私は完全に同じ効果(map toUpper
のような)を達成するために関数を書き直すことができることを理解しています。私は主に、ポイントフリーのに、再帰関数を書かれているように使って興味を持っています。
この関数をポイントフリーで書くことができない場合は、何が欠けていますか?
は '叫ぶ=地図toUpper'の仕事でしょうか? –
ああ、完全に調整する方法は間違いありませんが、再帰的なバージョンポイントを自由にできるかどうかは疑問でした。これを入力すると「再帰がポイントフリーではないのかもしれません」と思っています。 – Matt
'(toUpper。head):(shout。tail)'を修正することができたとします(可能です)。どのように再帰が終了するのですか?あなたはいくつかの状態を評価する必要があります。どのようにポイントフリーの状態で条件を書いていますか? –