Как передать список функции? - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать функцию, которая принимает список карт и возвращает список без определенной карты в нем.Как передать список определенных типов в функцию?

Я передал список функции, и он заявил, что мои типы не совпадают.

type Suit = Clubs | Diamonds | Hearts | Spades
type Rank = Jack | Queen | King | Ace | Num of int
type Card = Rank * Suit
type Color = Red | Black
type Move = Discard of Card | Draw


let cards = [(Jack,Clubs); (Num(8),Spades)]
let c:Card = Jack, Clubs

let remove_card (cs, c:Card, e:string) = 
  cs
remove_card cards c "Err"

Ожидаемый список вернется правильно, когдавызывающая функция remove_card.Но выдается ошибка:

Ожидается, что это выражение будет иметь тип '(' a -> 'b ->' c) * Card * string ', но здесь есть список типа' (Rank * Suit) '

Ответы [ 2 ]

3 голосов
/ 19 мая 2019

Это потому, что вы определили свою функцию remove_card как функцию, которая принимает один параметр с кортежем и возвращает значение, но вы вызываете его как функцию, которая принимает три параметра. Чтобы вызвать remove_card так, как вы его определили, вам нужно вызвать его как remove_card (cards, card, "Err"), создав кортеж с тремя аргументами и вызвав функцию с ним. Я думаю, что вы, вероятно, хотели сделать, было:

let remove_card cardList cardToRemove err = 
  cardList

remove_card cards c "Err"

т.е. создание функции с тремя аргументами вместо одного аргумента с кортежами.

2 голосов
/ 19 мая 2019

Синтаксис параметров в F # весьма отличается от других распространенных языков.

Ваша функция, хотя выглядит как имеющая 3 параметра, на самом деле имеет только один параметр, который является кортежем из 3 компонентов.

Поэтому вы должны называть это как remove_card (cards, c, "Err")

Однако в идиоматическом F # без особых требований мы часто не используем кортеж для параметров.Вместо этого мы используем отдельные параметры, чтобы использовать частичное приложение при необходимости:

let remove_card cs (c:Card) (e:string) = ...
let remove_card_withFixedCards = remove_card cards
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...