F# 的柯里化问题。将函数附加到类型的正确方法是什么?
Currying issues with F#. What is the right way to attach functions to the type?
我无法理解以下代码有什么问题:
let toClass (problem:Problem<'a>) (classID:int) (items:'a list) =
let newFreqTable = (problem.FreqTables.[classID]).count items
{ problem with FreqTables = newFreqTable :: (problem.FreqTables |> List.filter (fun i -> i.ClassID <> classID)) }
type Problem<'a> when 'a : equality with member this.toClass (classID:int) (items:list<'a>) = toClass this classID items
我有一个 Problem
类型,它只是一种将任意数量的 FreqTables
分组的方法 - "Frequency tables" 的缩写。所以 toClass
方法只采用适当的 freqTable(通过 classID
参数)和 returns 一个新的 - 计算给定的项目。
let typeIndependentCall = toClass p 0 ["word"; "word"; "s"] // this works perfectly
let typeDependentCall = typeIndependentCall.toClass 1 ["word"; "s"]
// gives an error: "One or more of the overloads of this method has
// curried arguments. Consider redesigning these members to take
// arguments in tupled form".
我对 F# 和函数式编程还很陌生。将行为附加到我的类型的正确方法是什么?
在 F# 中,主要有两种将参数传递给函数的方法:柯里化和元组化。柯里化形式是您在上面的代码中使用的形式,它有一些主要好处,首先是部分应用。
例如,而不是想
fun add a b = a + b
作为一个接受 2 个参数和 returns 一个值的函数,我们可以将其视为一个参数的函数,即 returns 一个具有一个参数的函数。这就是为什么我们函数的类型签名是
Int -> Int -> Int
或者,更清楚地说,
Int -> (Int -> Int)
但是重载方法时,只能使用元组参数形式
(Int, Int) -> Int
这样做的原因是为了优化,正如所讨论的here
要使您的代码正常工作,请使用
type Problem<'a> when 'a : equality with member this.toClass (classID:int, items:list<'a>) = toClass this classID items
并这样称呼它:
let typeDependentCall = typeIndependentCall.toClass(1, ["word"; "s"])
我无法理解以下代码有什么问题:
let toClass (problem:Problem<'a>) (classID:int) (items:'a list) =
let newFreqTable = (problem.FreqTables.[classID]).count items
{ problem with FreqTables = newFreqTable :: (problem.FreqTables |> List.filter (fun i -> i.ClassID <> classID)) }
type Problem<'a> when 'a : equality with member this.toClass (classID:int) (items:list<'a>) = toClass this classID items
我有一个 Problem
类型,它只是一种将任意数量的 FreqTables
分组的方法 - "Frequency tables" 的缩写。所以 toClass
方法只采用适当的 freqTable(通过 classID
参数)和 returns 一个新的 - 计算给定的项目。
let typeIndependentCall = toClass p 0 ["word"; "word"; "s"] // this works perfectly
let typeDependentCall = typeIndependentCall.toClass 1 ["word"; "s"]
// gives an error: "One or more of the overloads of this method has
// curried arguments. Consider redesigning these members to take
// arguments in tupled form".
我对 F# 和函数式编程还很陌生。将行为附加到我的类型的正确方法是什么?
在 F# 中,主要有两种将参数传递给函数的方法:柯里化和元组化。柯里化形式是您在上面的代码中使用的形式,它有一些主要好处,首先是部分应用。
例如,而不是想
fun add a b = a + b
作为一个接受 2 个参数和 returns 一个值的函数,我们可以将其视为一个参数的函数,即 returns 一个具有一个参数的函数。这就是为什么我们函数的类型签名是
Int -> Int -> Int
或者,更清楚地说,
Int -> (Int -> Int)
但是重载方法时,只能使用元组参数形式
(Int, Int) -> Int
这样做的原因是为了优化,正如所讨论的here
要使您的代码正常工作,请使用
type Problem<'a> when 'a : equality with member this.toClass (classID:int, items:list<'a>) = toClass this classID items
并这样称呼它:
let typeDependentCall = typeIndependentCall.toClass(1, ["word"; "s"])