Haskell к F# - объявляет рекурсивные типы в f#

Я пытаюсь преподавать мой сам 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.

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

5
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

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

type Op = Add | Sub | Mul | Div
type Expr = Val of int | App of Op * Expr * Expr
14
ответ дан 18 December 2019 в 10:45
поделиться

@kvb разместил справа ответ.

См. также

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

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

2
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: