Поддерживает ли F # шаблоны или шаблоны? - PullRequest
3 голосов
/ 07 января 2010

Я хочу реализовать структуру данных кучи и хочу применить код к любому типу, который поддерживает сравнение, т. Е. <=> <=> = Операции.

Как это сделать в F #, так как он статически типизирован.

Ответы [ 3 ]

9 голосов
/ 07 января 2010

Да, но вы должны аннотировать следующим образом:

type Thing<'a when 'a:comparison> =
    | Pair of ('a*'a)
    with 
      member m.InOrder() = 
        match m with
        | Pair (a,b) when a<=b -> true
        | _ -> false
      member m.Equal() =
        match m with 
        | Pair (a,b) when a=b -> true
        | _ -> false

Pair(1,2).InOrder() //true
Pair(3,2).InOrder() //false
Pair(42,42).Equal() //true

Попробуйте заменить Thing<'a when 'a:comparison> на Thing<'a when 'a:equality>, чтобы убедиться, что метод InOrder() не работает, пока Equal() все еще работает. Замените Thing<'a when 'a:comparison> на Thing<'a>, и оба метода не будут работать.

5 голосов
/ 07 января 2010

Подробнее о конкретных случаях ограничения равенства и сравнения см.

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1621.entry

и

http://blogs.msdn.com/dsyme/archive/2009/11/08/equality-and-comparison-constraints-in-f-1-9-7.aspx

3 голосов
/ 07 января 2010

Да, он поддерживает дженерики - посмотрите на это в качестве примера.

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