Код компилируется с помощью netcore, но не компилируется с использованием mono - PullRequest
0 голосов
/ 29 января 2019

Я использую Ubuntu 18.04 LTS, использую моно версию 5.18.0.2140, и мой код не будет компилироваться под моно, пока он компилируется, если я использую netcore с VS Code.Тем не менее, я должен использовать моно для этого задания, поэтому я не уверен, что происходит не так.Команда, которую я использую:

fsharpc --nologo chessApp.fsx && mono chessApp.exe

Ошибка происходит в этой части кода ( из этой строки и вниз , полный текст внизу):

let playerOne = Chess.Human(Color.White) // Here
let playerTwo = Chess.Human(Color.Black) // Here

let game = new Chess.Game()
game.run(playerOne, playerTwo, board, pieces) // and here

Я получаю следующую ошибку:

 chessApp.fsx(28,17): The object constructor 'Human' takes 0 argument(s) but is here given 1. The requried signature is 'new : unit -> Human'.

 chessApp.fsx(29,17): The object constructor 'Human' takes 0 argument(s) but is here given 1. The requried signature is 'new : unit -> Human'.

 chessApp.fsx(31,1): This value is not a function and cannot be applied.

Я не получаю эти ошибки, используя VS Code.Это работает там.Например, Human принимает 1 аргумент netcore в VS Code, который распознает это, но mono - нет.Чтобы не делать этот вопрос длиннее, чем нужно, я загрузил код в суть прямо здесь .

1 Ответ

0 голосов
/ 29 января 2019

Я попытался воспроизвести это, запустив компилятор из командной строки в Windows.В исходном файле fsx есть две незначительные ошибки.Во-первых, вы открываете неправильное пространство имен:

#r "chess.dll"
#r "pieces.dll"

open Chess
open Pieces // <- This should be open 'Piece'

Во-вторых, коллекция pieces должна быть списком, а не массивом:

let pieces =
   [ king (White) :> chessPiece
     rook (White) :> chessPiece
     king (Black) :> chessPiece
     rook (Black) :> chessPiece ]

С этими двумя изменениями яудалось скомпилировать все:

fsharpc --target:library chess.fs
fsharpc --target:library -r:chess.dll pieces.fs
fsharpc chessApp.fsx

Обратите внимание, что вам нужно --target:library, чтобы указать, что это должно создать файл dll, а также -r:chess.dll для второго файла, чтобы сказать, что он должен ссылатьсяпервый dll.

Было бы намного проще, если бы вы ссылались на два других файла как исходные файлы, используя #load, а не как скомпилированные файлы, используя #r:

#load "chess.fs"
#load "pieces.fs"

Затем вы можете скомпилировать все это, просто запустив fsharpc chessApp.fsx, и вы получите один отдельный исполняемый файл.

...