Я пытаюсь преподавать мой сам F# путем портирования некоторого Кода Haskell.
Specifily я пытаюсь портировать проблему Countdown, показанную здесь
Код 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.
Как каждый создает рекурсивный тип? От этого ТАК вопрос, похоже, что нельзя создать тип Expr в F#.
Также, что F# эквивалентен из типа 'Приложения', которые применяют s тип Op к типу Expr.
Если не возможно непосредственно портировать этот код, мог кто-то предлагать альтернативную структуру данных.
Определить такие рекурсивные типы не проблема; что вы не можете сделать, так это создать типы более высокого порядка, которые параметризуются конструкторами типов (и которые не нужны в этом примере). При любом определении типа объединения вам необходимо отделить имя конструктора от параметров конструктора ключевым словом "of", а сами параметры должны иметь форму типа кортежа (т.е. они должны быть разделены звездочками):
type Op = Add | Sub | Mul | Div
type Expr = Val of int | App of Op * Expr * Expr
@kvb разместил справа ответ.
См. также
, чтобы узнать, как делать что-то, когда вам нужны взаимно рекурсивные типы.