功能签名的别名

时间:2018-10-27 09:06:05

标签: haskell functional-programming

我正在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

2 个答案:

答案 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


¹我最初是被误认为:您可以添加参数。