私は現在、Martin Odersky の Coursera クラス、Functional Programming Principles in Scala のビデオ講義に取り組んでいます。講義 2.1 では、基底関数 を使用した高階関数の構成を示していますsum()
。彼は末尾再帰なしで階乗を実装しましたが、私は末尾再帰を使ってみました。これはまだ 1 行のコードだからです。その結果、Odersky ではなかったと思われる型の不一致が発生しました。の定義sum()
では、パラメータf
は を受け取り、Int
を返しますInt
。関数*を調整することでこれを回避できることはわかっていますが、これにより、一般的に高階関数を設計する方法について疑問が生じます。 柔軟な数の引数を取る関数を許可するために、この型定義を調整または回避する方法はありますか? 誰かが Haskell を少し見せてくれたことがあるのですが、Scala の関数パラメーターを同様に緩い方法で型付けできるかどうか疑問に思っています... あるいは、Scala によりネイティブな別の解決策があるかもしれません。私は昨日 Scala を使い始めたばかりで、コンピューター サイエンスの知識が限られていると仮定してください。まさにその通りです。
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a+1, b)
//Factorial with tail recursion. The one in the lesson DOES NOT use tail recursion.
//prev is an accumulator.
def fact(a: Int, prev:Int = 1): Int =
if (a == 0) prev else fact(a-1, a * prev)
def sumFactorials(a: Int, b: Int): Int = sum(fact, a, b)
fact()
*次のように、現在の関数を別の関数内にネストすることで、これを修正できることを知っています。
def factorial(a: Int): Int ={
def fact(n: Int, prev:Int = 1): Int =
if (n == 0) prev else fact(n-1, n * prev)
fact(a)
}
前述の Haskell での経験からの私の印象は、関数型プログラミングは、カリー化を可能にするために引数を 1 つだけ取る関数を促進するというものでした。とにかく、それは実際の質問とは少し関係がありますが、私の質問の精神で FP を恐ろしく解体しているだけなら、コメントで気軽にこれに対処してください。