#f#
#f#
Вопрос:
Я новичок. Учитывая, что каждый из них представляет разные классы в C#:
- ContactDetails
- Интернет
- Номера телефонов
- Адреса
Как создается «список» в F # для хранения различных конкретных типов?
Все вышеупомянутые типы будут иметь общее поле:
- Name — строка
За пределами имени все конкретные типы будут иметь разные поля и содержимое.
Этот тип «списка» должен использоваться WFP / XAML.
(Я думаю, что необходимо использовать интерфейс для списка F #, но я не знаю, как это реализовано — F # действительно действительно новый для меня. 🙂
TIA
Ответ №1:
Рассмотрите возможность использования Seq вместо List, чтобы помочь клиентам C #:
Я бы рекомендовал использовать последовательность (т. Е. seq) вместо списка для использования C #. Следовательно, последовательность в F # приравнивается к IEnumerable в C #. Таким образом, вы сможете использовать эти элементы из своего приложения Windows.
Вот как я бы реализовал это требование:
type ContactDetail = { Name : string; Other:string }
type Internet = { Name : string; Other:string }
type PhoneNumber = { Name : string; Other:string }
type Address = { Name : string; Other:string }
type MyType =
| ContactDetails of ContactDetail seq
| Internet of Internet seq
| PhoneNumbers of PhoneNumber seq
| Addresses of Address seq
let contactDetail : ContactDetail = { Name="some name"; Other="???" }
let contactDetails = ContactDetails [contactDetail]
let internet : Internet = { Name="some name"; Other="???" }
let internets = Internet [internet]
let phoneNumber : PhoneNumber = { Name="some name"; Other="???" }
let PhoneNumbers = PhoneNumbers [phoneNumber]
let myTypes : MyType seq = seq [ contactDetails
internets
PhoneNumbers
]
Ответ №2:
Извините, это то, чего вы хотите?
F#
module FSharpTest.ListTest
open System
type YourType = Object
type ContactDetails = YourType
type Internet = YourType
type PhoneNumbers = YourType
type Addresses = YourType
type WrapperOfCSharpClass =
| CD of ContactDetails
| I of Internet
| PN of PhoneNumbers
| A of Addresses
let list = [
Unchecked.defaultof<WrapperOfCSharpClass>
CD (new ContactDetails())
I (new Internet())
]
C#
using System;
using FSharpTest;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var fsharplist_item = ListTest.list[0];
if (fsharplist_item.IsPN)
{
Console.WriteLine("I am a phone number");
} else if (fsharplist_item.IsA)
{
Console.WriteLine("I am an address");
}
}
}
}