小编Ben*_*ach的帖子

如何在Haskell中从IO操作中获取正常值

我有以下功能:

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作为参数,然后提取并重新打包它们.这似乎没必要.

谢谢!

io monads haskell

18
推荐指数
2
解决办法
1万
查看次数

从理论上讲,这是列表的有效comonad实例吗?

我正在努力掌握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正确地实例化,或者仅仅由用户决定 …

haskell list comonad

15
推荐指数
2
解决办法
1509
查看次数

Haskell中的隐性函数组合

假设我有一个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?

haskell function composition pointfree tacit-programming

13
推荐指数
2
解决办法
590
查看次数

是否可以在Groovy中为其自己的类型提供Enums实例变量?

我在Groovy中制作一个Text Adventure游戏作为一种练习,我遇到了一个奇怪的错误.

现在,我有enum一个玩家能够前往的方向,目前包含北,南,东,西,上和下.

我有一个Room课程,其中包含Map其他连通房间及其方向.当我在某个时候添加Room到另一个RoomDirection,我希望能够在相反的方向上将电流添加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>.

在这种情况下,会添加一个条目 …

java groovy enums

8
推荐指数
1
解决办法
1277
查看次数

如何配置多个格式化程序以在 VSCode 中保存时按顺序运行?

我正在开发一个 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各种参数进行调用的本地扩展,它只是弹出一个可用格式化程序的下拉列表以供选择。

如何在保存时按顺序运行两个格式化程序?

visual-studio-code vscode-extensions

8
推荐指数
2
解决办法
6840
查看次数

是否可以在Haskell中的列表上映射函数元组?

我正试图找到一种方法来做这样的事情:

(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 tuples function applicative

6
推荐指数
2
解决办法
732
查看次数

如何在Haskell中实现^运算符?

我正在为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类型一个实例允许我^在其上使用运算符?

谢谢!

haskell types operator-overloading fractions

6
推荐指数
1
解决办法
285
查看次数

如何隐藏[](或[]的Monad实例?

我正在尝试完成Typeclassopedia中的一些练习,但是我无法定义我自己的Monad实例[],因为我似乎无法隐藏它.我能够Maybe有效地隐藏,但当我试图隐藏时[],我收到此错误:parse error on input '['

我正在使用这行代码导入:

import Prelude hiding (Maybe, Just, Nothing, [])
Run Code Online (Sandbox Code Playgroud)

更改[]([])也无法解决此问题.

我不知道该怎么做.任何帮助都会很棒!谢谢!

import monads haskell list

6
推荐指数
1
解决办法
210
查看次数

Haskell中并发性的奇怪行为

我有以下代码:

import Control.Concurrent

sleepSort = mapM_ (forkIO . put)
  where put x = threadDelay (x*10000) >> print x
Run Code Online (Sandbox Code Playgroud)

这对一组整数执行睡眠排序,并且工作正常,除了一个警告:

程序按顺序打印出数据集中的每个数字,就像它应该的那样.但是,在完成打印出最后一个数字后,它会等待用户键入一些数字,然后回显该数字,然后完成.

我不认为我在任何时候都要求用户输入,为什么会发生这种情况呢?

sorting multithreading haskell sleep

6
推荐指数
1
解决办法
209
查看次数

如何避免在整个程序中使用IO monad?

我正在使用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)

io haskell

6
推荐指数
1
解决办法
777
查看次数