【发布时间】:2011-12-15 16:41:00
【问题描述】:
我对 haskell 很陌生,对它的类型系统还不太熟悉。我想知道,如果有能力定义类型(数据类型?),哪些实例可以被称为函数?
类比是
__call__
Python 中的方法或类方法
operator()
在 C++ 中。 (维基百科中给出了“函数对象”一词的更多示例)。
这种构造的应用示例是 Polynom。该对象由其系数列表定义,即我想要这样的类型:
data Num a => Polynom a = Polynom [a]
deriving (...)
现在我当然可以定义函数了
callPoly :: Num a => (Polynom a) -> a -> a
callPoly p x = ... -- implementation: extract coefficients of p,
-- construct polynomial and call it on x
(这里我不打扰,能够在浮点数上调用具有 Int 系数的多项式......这只是技术细节)
现在我可以在我的多项式上调用它(在交互式提示中):
let myPoly = Polynomial [1 2 3]
let applicationResult = callPoly myPoly 3
但这种方式并不太花哨。是希望能够直接调用多项式为
let applicationResult = myPoly 3
那么问题来了:可以定义这样的Polynomial类型,哪些对象(实例)可以被调用(作为函数使用)?可能这种模式可以以其他方式实现,而不涉及“数据”?可能是一些玩函数类型或smth。还有吗?
当然,这个想法不仅可以应用于多项式。实际上,对于任何必须“具有类型”并具有“一些附加数据”的函数(在多项式的情况下 - 它是系数)。
或者如果这是不可能的,那么是有什么具体原因还是不支持?
P.S.:在我看来,直接方法(如上所述)是不可能的,因为可调用的 myPoly 必须是 (Int -> Int) 类型。但是类型 (Int -> Int) 不能附加任何数据(例如多项式系数)。但我想确定,我是对的。
【问题讨论】:
-
let myPoly = callPoly (Polynomial [1, 2, 3])有什么问题? -
为什么不发明自己的多项式应用程序“语法”,例如
[] ||| x = 0 ; (c :cs) ||| x = c + x * (cs ||| x)然后在ghci你问[1,2,3,4,5] ||| 3并得到547作为答案。 -
@shang 谢谢。最新链接正是我想要的。抱歉,我自己没有找到。
标签: haskell