Haskell для F # - объявить рекурсивные типы в f # - PullRequest
5 голосов
/ 16 декабря 2009

Я пытаюсь научить себя F #, портируя некоторый код на Haskell.

В частности, я пытаюсь перенести показанную проблему отсчета здесь

Код Хаскелла указан здесь

Я пытаюсь создать следующие типы Haskell в F #:

data Op      = Add | Sub | Mul | Div

data Expr    = Val Int | App Op Expr Expr

В F # я думаю, что тип Op определяется следующим образом:

type Op = | Add | Sub | Mul | Div

У меня проблемы с типом Expr.

Как создать рекурсивный тип? Из этого SO вопроса похоже, что нельзя создать тип Expr в F #.

Кроме того, что является эквивалентом типа F # типа «App», который применяется с типом Op к типу Expr.

Если невозможно напрямую портировать этот код, может кто-нибудь предложить альтернативную структуру данных.

Ответы [ 2 ]

14 голосов
/ 16 декабря 2009

Это не проблема для определения рекурсивных типов, как это; то, что вы не можете сделать, это создать типы с более высоким родом, которые параметризованы через конструкторы типов (и которые не нужны для этого примера). При любом определении типа объединения необходимо отделить имя конструктора от параметров конструктора с помощью ключевого слова «of», а сами параметры должны иметь форму типа кортежа (то есть они должны быть разделены звездочками):

type Op = Add | Sub | Mul | Div
type Expr = Val of int | App of Op * Expr * Expr
2 голосов
/ 16 декабря 2009

@ kvb отправил правильный ответ.

Смотри также

F # объявления типа вперед

о том, как действовать, когда вам нужно нужны взаимно рекурсивные типы.

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