我有以下功能:
get :: Chars -> IO Chars
get cs = do
char <- getChar
let (dats, idx) = (curData cs, curIndex cs)
let (x,y:xs) = splitAt idx dats
let replacement = x ++ (ord char) : xs
return $ Chars replacement idx
Run Code Online (Sandbox Code Playgroud)
而且我想从中得到一个Chars价值,而不是 IO行动.我不知道怎么做,或者甚至可能.
Chars基本上只是一个[Int]名为curData且Int名为curIndex的容器.细节并不重要,我只是想知道这个函数是否有办法返回一个Chars而不是一个IO Chars.
如果没有,我如何将此作为参数传递给一个带有Chars?的函数?我是Haskell IO的新手,但我不认为我希望所有Chars以参数为参数的函数都必须IO Chars作为参数,然后提取并重新打包它们.这似乎没必要.
谢谢!
我正在努力掌握comonads的概念,在阅读了这篇博文之后,我想我对他们的工作以及他们与monad的关系有了深刻的理解.但是,我想我会深入研究这个主题,只考虑一下通用列表类型的comonad实例(你知道[a])会是什么样子,而且我已经找到了一篇我不完全知道的内容.正确.
因此,考虑到博客帖子使用的实例:
class Functor w => Comonad w where
(=>>) :: w a -> (w a -> b) -> w b
coreturn :: w a -> a
cojoin :: w a -> w (w a)
Run Code Online (Sandbox Code Playgroud)
我认为实例声明[a]看起来像这样(语法[a]可能要么不可能,要么错了,但你明白了这个想法):
instance Comonad [a] where
coreturn = head
cojoin = Data.List.subsequences --this is what I'm confused about
x =>> f = map f (cojoin x)
Run Code Online (Sandbox Code Playgroud)
在这里,我们只是找到所有subsequences列表,但只使用它powerset或其他东西是完全可行的.表单列表上有几个函数,(a -> [a])对于哪一个是正确的,它有点含糊不清.
这是否意味着[a]无法作为comonad正确地实例化,或者仅仅由用户决定 …
假设我有一个mean如此定义的函数:
mean xs = sum xs / (fromIntegral $ length xs)
Run Code Online (Sandbox Code Playgroud)
但我想以某种默契形式,像这样:
mean = sum / (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
是否有内置的Haskell方法可以在这些行中执行某些操作而无需构建自己的tacit函数(类似这样):
tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)
Run Code Online (Sandbox Code Playgroud)
在这种形式中,函数如下所示:
mean = tacit (/) sum (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
但感觉可能有一种方法可以避免使用像这样的显式函数.我是在想; 是否有一些方法可以做到内置于Haskell?
我在Groovy中制作一个Text Adventure游戏作为一种练习,我遇到了一个奇怪的错误.
现在,我有enum一个玩家能够前往的方向,目前包含北,南,东,西,上和下.
我有一个Room课程,其中包含Map其他连通房间及其方向.当我在某个时候添加Room到另一个Room时Direction,我希望能够在相反的方向上将电流添加Room到另一个.Room
例如:如果我将房间1到房间2的连接添加到北方,我希望能够同时从房间2到房间1添加连接.
目前,我正在尝试使用带有附加实例变量(类型)的enum命名来实现它.这是不允许的?我没有得到编译器错误或任何东西,但我似乎无法让它工作.DirectionoppositeDirection
这是完整的enum声明:
public enum Direction {
North(South), South(North), East(West), West(East), Up(Down), Down(Up)
private Direction opposite
Direction(Direction d){
opposite = d
}
public opposite(){
return opposite
}
}
Run Code Online (Sandbox Code Playgroud)
这是我从以下方法调用它的方法:
public void addConnection(Direction d, Spot spot){
connections[d] = spot
spot.connections[d.opposite()] = this
}
Run Code Online (Sandbox Code Playgroud)
这里connections是一个public Map<Direction, Spot>.
在这种情况下,会添加一个条目 …
我正在开发一个 Haskell 项目,该项目必须由以下两者格式化:
stylish-haskell(用于进口重新订购)brittany(用于一般格式)我可以为一种语言设置单一默认格式化程序:
"[haskell]": {
"editor.defaultFormatter": "MaxGabriel.brittany"
}
Run Code Online (Sandbox Code Playgroud)
editor.action.formatDocument.multiple或者我可以使用(“在命令选项板中使用...设置文档格式”)从列表中选择一个。
但我需要在保存时一个接一个地运行它们。截至目前,我只能在保存时运行单个默认格式化程序。在这种情况下顺序并不重要,但在更一般的情况下可能会很重要。
我尝试设置editor.defaultFormatter格式化程序列表(这没有按预期工作),并构建了一个使用editor.action.formatDocument.multiple各种参数进行调用的本地扩展,它只是弹出一个可用格式化程序的下拉列表以供选择。
如何在保存时按顺序运行两个格式化程序?
我正试图找到一种方法来做这样的事情:
(head, last) `someFunction` [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
生成元组(1, 3)作为输出.
它在理论上似乎与应用仿函数相似,但有点倒退.我猜测有一个类似的功能可以做到这一点(或某种方式来做一个),但我似乎无法找到它/想出来.
我尝试定义这样的函数:
fmap' :: ((a -> b), (a -> b)) -> [a] -> (b, b)
fmap' (f1, f2) xs = (f1 xs, f2 xs)
Run Code Online (Sandbox Code Playgroud)
但GHC实际上不会编译这个.
任何帮助都会很棒; 谢谢!
编辑(整整一年后!):
我fmap'不会编译,因为类型签名是错误的.显然有更好的方法来做我正在做的事情,但我的类型fmap'应该是:
fmap' :: ((a -> b), (a -> b)) -> a -> (b, b)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它编译并运行得很好.
我正在为Haskell中的Fraction数据类型创建一堆实例,我想知道是否有一个地方可以实现^运算符.
我的意思是,我有不同的几个实例Num类型和这些实例中,我定义了常见的操作,如+,-等.
有了它,数据类型就像我想要的那样表现为正常数字(意思是我可以调用类似的东西(Frac 1 2) + (Frac 1 4)并返回Frac 3 4)
我想要做的是^直接实施.现在,我已经将它定义为:
(|^|) :: Fraction -> Int -> Fraction
(|^|) f = foldr (*) mempty . flip replicate f
Run Code Online (Sandbox Code Playgroud)
当我尝试将函数的名称更改^为时,我收到错误,因为它与Prelude的定义冲突^.是否有一种Num类型我可以给我的Fraction类型一个实例允许我^在其上使用运算符?
谢谢!
我正在尝试完成Typeclassopedia中的一些练习,但是我无法定义我自己的Monad实例[],因为我似乎无法隐藏它.我能够Maybe有效地隐藏,但当我试图隐藏时[],我收到此错误:parse error on input '['
我正在使用这行代码导入:
import Prelude hiding (Maybe, Just, Nothing, [])
Run Code Online (Sandbox Code Playgroud)
更改[]为([])也无法解决此问题.
我不知道该怎么做.任何帮助都会很棒!谢谢!
我有以下代码:
import Control.Concurrent
sleepSort = mapM_ (forkIO . put)
where put x = threadDelay (x*10000) >> print x
Run Code Online (Sandbox Code Playgroud)
这对一组整数执行睡眠排序,并且工作正常,除了一个警告:
程序按顺序打印出数据集中的每个数字,就像它应该的那样.但是,在完成打印出最后一个数字后,它会等待用户键入一些数字,然后回显该数字,然后完成.
我不认为我在任何时候都要求用户输入,为什么会发生这种情况呢?
我正在使用Gloss库在Haskell中编写一个Sokoban程序,当达到一个级别时,我达到了我想要的程度,从文本文件加载到一个新的级别并让程序继续.
由于Gloss的限制,我对此有一点困难 - play设置游戏并让它不断更新的功能如下所示:
play :: forall world
. Display -- ^ Display mode.
-> Color -- ^ Background color.
-> Int -- ^ Number of simulation steps to take for each second of real time.
-> world -- ^ The initial world.
-> (world -> Picture) -- ^ A function to convert the world a picture.
-> (Event -> world -> world) -- ^ A function to handle input events.
-> (Float -> world -> world) -- ^ …Run Code Online (Sandbox Code Playgroud)