gpt4 book ai didi

haskell - 使用 Haskell 的随机元素网格

转载 作者:行者123 更新时间:2023-12-02 06:47:04 24 4
gpt4 key购买 nike

对 Haskell 的经验绝对为零,我需要想出一个与这个 Python 等效的代码:

from random import choice, sample

def random_subset():
return tuple(sample(('N', 'S', 'W', 'E'), choice((1, 2, 3, 4))))

def form_grid(n):
return [[random_subset() for _ in range(n)] for _ in range(n)]

form_grid(10)

产生这样的东西:
N     ESWN  SNEW  NSE   EWSN  E     ENSW  N     NSWE  WES   
NE WNS SWEN EWN ENWS WEN WS W ENSW NW
WENS NWE SNEW ES E S ES SENW EW WEN
NSE NE WNE NEWS SNE W SWNE NSWE SNEW EN
S SNW WNES S WESN E ES N ESN ES
SWEN S WSNE NEWS WESN E S SE E N
NEW S NEW WS W EN N NWS E WENS
WN NWE S SEW NESW EWSN WENS ES NWS WN
W NWE N N ES E E WN SWNE NES
WENS NWE NW WESN SW NES ENWS SE N SWNE

看在上帝的份上,我无法理解 Haskell 的 IO 概念(尤其是随机性)。我能想到的最好的是:

import Data.Random hiding (shuffle, sample)
import Data.Random.Source.Std
import Data.Random.Extras

randSubset :: IO [Char]
randSubset = do
len <- runRVar (choice [1..4]) StdRandom :: IO Int
subset <- runRVar (sample len ['N', 'S', 'W', 'E']) StdRandom :: IO [Char]
return subset

formGrid :: Int -> [[IO [Char]]]
formGrid n = [[subset | _ <- [0..(n - 1)], subset <- randSubset] | _ <- [0..(n - 1)]]

仍然没有这样做:
error:
* Couldn't match expected type `[IO [Char]]'
with actual type `IO [Char]'
* In the expression: randSubset
In a stmt of a list comprehension: subset <- randSubset
In the expression:
[subset | _ <- [0 .. (n - 1)], subset <- randSubset]
|
12 | formGrid n = [[subset | _ <- [0..(n - 1)], subset <- randSubset] | _ <- [0..(n - 1)]]
| ^^^^^^^^^^

快速谷歌搜索并没有太大帮助 - 我可能没有使用最准确的关键字来解决我面临的这个问题。进行随机更改并希望获得最好的结果变得非常令人沮丧,但我真的没有时间,也没有精力正确地深入研究 Haskell(尽管这很遗憾),所以现在,我希望有人能指出我的想法这段代码错了。

最佳答案

就像错误已经说的那样,您的列表理解有一个生成器:

formGrid n = [[subset | _ <- [0..(n - 1)], subset <- randSubset] | _ <- [0..(n - 1)]]

所以这意味着它期望 randSubset成为某物的列表,但它不是某物的列表,它是 IO的东西的列表。因此,您不能使用它。

你的函数的类型也有点问题,你用 [[IO [Char]]] ,所以矩阵 IO [Char] s。

您可能正在寻找 replicateM :: Monad m => Int -> m a -> m [a] ,所以你的程序看起来像:
import Control.Monad(replicateM)

formGrid :: Int -> IO [[[Char]]]
formGrid n = replicateM n (replicateM n randSubset)

例如:
Main> formGrid 3
[["WSNE","WNS","S"],["WN","SN","WEN"],["SEWN","ESN","NESW"]]

关于haskell - 使用 Haskell 的随机元素网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com