我正在对 Elm 进行独立研究,我觉得我正在重新学习编程!作为一个学习语言的项目,我试图让一个简单的二十一点开始并运行,但一旦我开始,我意识到我仍然没有掌握多少。我已经从牌组中抽牌并将它们添加到列表中:
import Random
import Mouse
import Array
--Build the deck
faces = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
suits = ['H', 'D', 'C', 'S']
allCards faces suits =
case suits of
x :: xs -> family faces x ++ allCards faces xs
_ -> []
family faces suit =
case faces of
x :: xs -> (,) x suit :: family xs suit
_ -> []
deck = allCards faces suits
rand : Signal Int
rand = Random.range 0 (length deck-1) Mouse.clicks
pickCard n = head <| drop n deck
nextCard = lift pickCard rand
yourHand = foldp (::) [] nextCard
main = lift asText yourHand
我的问题主要是关于如何继续。查看已完成的 Elm 项目会有所帮助,但作为初学者,我很难解析其中的许多项目。任何方向都有帮助!
我遇到的第一个问题是试图弄清楚如何在卡片被抽出后从牌堆中移除,使用类似
dropCard deck card = filter (\card /= nextCard) deck
从列表中过滤掉抽出的卡片。但我对 Elm 的理解是,每次信号变化时,程序都会重新评估,这意味着每次抽牌时都会重新创建完整的牌组。我也需要foldp
原来的甲板吗?在函数式编程中从一个列表中删除一个元素并将其添加到另一个列表中的正确方法是什么?函数组合,例如
toHand . dropCard card
?为了添加卡面以确定输赢,我不确定如何从列表中获取整数值。我试着做
fst (head deck)
,但我得到了类型错误,可能是因为甲板本身就是某种信号。有什么我没看到的吗?
也就是说,到目前为止,我真的很喜欢 Elm!