我正在Haskell中实现kNN算法。因此,我需要距离函数。 第一个效果很好
import Data.Composition
import Data.Vector
taxicab :: Num a => Vector a -> Vector a -> a
taxicab = Data.Vector.sum .: Data.Vector.zipWith (\ x y -> abs $ x - y)
如何为Distance
创建别名Num a => Vector a -> Vector a -> a
?
我可以这样写:
taxicab :: Distance
答案 0 :(得分:3)
就像您为另一种类型创建类型别名一样:
type Distance a = Num a => Vector a -> Vector a -> a
实际上,函数是“类型构造函数”:如果您编写a -> b
,则您以更规范的形式编写了(->) a b
,这意味着您基本上已经编写了:
type Distance a = Num a => (->) (Vector a) ((->) (Vector a) a)
但是请注意,我们需要在此处添加类型参数a
,因此您的taxicab
的类型为:
taxicab :: Distance a
答案 1 :(得分:2)
您可能想定义一个type synonymn(或参见this other page)。没有参数¹不可能直接包括类约束,但是您可以使用参数化类型同义词:
type Distance a = Vector a -> Vector a -> a
taxicab :: Num a => Distance a
这使您可以定义具有不同约束的Distance
。
¹我最初是被误认为:您可以添加参数。