Я установил mono на OS X через brew install mono
, а F # v. 4.01 загружается, когда я запускаю fsharpi
в терминале.Как загрузить файл .fsx в моно (OS X) и использовать внутренние типы функции?
У меня есть файл .fsx
, который определяет некоторые типы и функции. Я хочу использовать их в интерактивном режиме в fsi
(псевдоним для fsharpi
). Для этого я запускаю fsi
и запускаю #load "pc.fsx;;"
- файл загружается и компилируется, и я вижу все определения типов и типы функций под общим пространством имен. По какой-то причине REPL не распознает настраиваемые типы (поэтому я не могу использовать конструкторы типов) и функции, поэтому я получаю ошибку FS0039: The value or constructor '<insert type or function name>' is not defined
. Как я могу это преодолеть?
EDIT: Файл имеет имя Temp.fsx
и содержимое обернуто модулем с именем Temp
.
Содержание файла:
module Temp =
open System
/// Type that represents Success/Failure in parsing
type Result<'a> =
| Success of 'a
| Failure of string
/// Type that wraps a parsing function
type Parser<'T> = Parser of (string -> Result<'T * string>)
/// Parse a single character
let pchar charToMatch =
// define a nested inner function
let innerFn str =
if String.IsNullOrEmpty(str) then
Failure "No more input"
else
let first = str.[0]
if first = charToMatch then
let remaining = str.[1..]
Success (charToMatch,remaining)
else
let msg = sprintf "Expecting '%c'. Got '%c'" charToMatch first
Failure msg
// return the "wrapped" inner function
Parser innerFn
/// Run a parser with some input
let run parser input =
// unwrap parser to get inner function
let (Parser innerFn) = parser
// call inner function with input
innerFn input
Компиляция выход из fsi
:
$ fsi
F# Interactive for F# 4.1
Freely distributed under the Apache 2.0 Open Source License
For help type #help;;
> #load "Temp.fsx";;
[Loading /Users/asaf/programming/PCfs/Temp.fsx]
namespace FSI_0002
module Temp = begin
type Result<'a> =
| Success of 'a
| Failure of string
type Parser<'T> = | Parser of (string -> Result<'T * string>)
val pchar : charToMatch:char -> Parser<char>
val run : parser:Parser<'a> -> input:string -> Result<'a * string>
end
Что вы имеете в виду по пользовательским типам? Можете ли вы показать более конкретный пример того, как типы определены в файле и как они вызывается. FSI помещает типы под настраиваемое пространство имен. Является ли он внутри некоторого модуля/пространства имен? Что делать, если вы #load или #r .fs-файл? – s952163
Тип Результат <'a> = | Успех 'a | Сбой строки Код не находится внутри модуля или пространства имен. – asafc
Поместите в модуль как минимум. Я не проверял другие способы обхода. – s952163