Псевдоним для подписи функции - PullRequest
0 голосов
/ 27 октября 2018

Я реализую алгоритм kNN в Haskell. Поэтому мне нужны функции расстояния. Первый работает хорошо

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 голосов
/ 27 октября 2018

Так же, как вы создаете псевдоним типа для другого типа:

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 <b>a</b>
0 голосов
/ 27 октября 2018

Возможно, вы хотите определить синоним типа (или см. эту другую страницу ).Непосредственно невозможно включить ограничение класса без параметра ¹, но вы можете иметь синоним параметризованного типа:

type Distance a = Vector a -> Vector a -> a

taxicab :: Num a => Distance a

Это позволяет вам определять Distance s сразличные ограничения.


¹ Сначала я ошибся: вы можете добавить параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...