在Haskell中执行rollsNDice函数的问题

我正在Haskell中尝试随机性,我想做一个给定Int n返回1到6之间的随机数状态的函数:

actionLink

但是当我尝试在ghci中运行它时,我得到了:

@using SLMDemo0.Models
@model IEnumerable<UP>

@{
  ViewBag.Title = "Details";
  //Review TempData,it's session data that clears at the end of the next request
  TempData["GenerateFile"] = Model.ToArray();
}
...

@Html.actionLink("GenerateFile","GenerateFile");

我不明白该错误。有什么想法吗?

bishileiaaaa 回答:在Haskell中执行rollsNDice函数的问题

之所以不起作用,是因为[]的类型为[a],您不能使用[] :: State StdGen [Int]将其转换为State StdGen [Int]

不过,您可以使用pure :: Applicative m => a -> m a将其包装在State StdGen [Int]中:

rollNDice :: Int -> State StdGen [Int]
rollNDice 0 = pure []
rollNDice n = (:) <$> rollDie <*> rollNDice (n-1)

话虽如此,您可以在此处使用replicateM :: Applicative m => Int -> m a -> m [a]来生成n个项目的列表:

import Control.Monad(replicateM)

rollNDice :: Int -> State StdGen [Int]
rollNDice = (`replicateM` rollDie)

例如:

Prelude System.Random Control.Monad.Trans.State Control.Monad> evalState (rollNDice 5) (mkStdGen 0)
[6,6,4,1,5]
本文链接:https://www.f2er.com/3160025.html

大家都在问