小编Zub*_*air的帖子

stack.yaml文件和.cabal文件的区别?

我最近开始为Haskell使用stack,为项目指定外部依赖项.有时您将它放在.cabal文件中,而有时您将它放在.yaml文件中.

我是否正确地认为当您将其放入cabal文件时,它只会在堆栈存储库中查找您的包.但是,当您将它放在.yaml文件中时,它还会在Hackage服务器中搜索,如果它在任何快照中都找不到它?

haskell package cabal

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

(r - >)applicative functor

我在理解(->) rApplicative 的函数实例如何在Haskell中工作时遇到了一些麻烦.

例如,如果我有

(+) <$> (+3) <*> (*100) $ 5
Run Code Online (Sandbox Code Playgroud)

我知道你得到的结果508时,我就明白,你需要的结果(5 + 3)(5 * 100)你申请的(+)功能,这两种.

但是我不太明白发生了什么.我假设表达式括号如下:

((+) <$> (+3)) <*> (*100)
Run Code Online (Sandbox Code Playgroud)

根据我的理解,正在发生的事情是您(+)对最终结果的映射(+3),然后您正在使用<*>运算符将该函数应用于最终结果(*100)

但是我不明白的实施<*>(->) r实例,我为什么不能写:

(+3) <*> (*100)
Run Code Online (Sandbox Code Playgroud)

怎样的<*>,<$>当它涉及到运营商的工作(->) r

haskell functor applicative

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

与Travis CI叠加

我最近一直在尝试使用带有堆栈的travis CI,并且我已经遇到了一些问题.

我的.travis.yml文件位于我的仓库中:(我在堆栈网站上使用了指南)我的配置文件的快照如下:

sudo: false

# Caching so the next build will be fast too.
cache:
  directories:
  - $HOME/.stack

before_install:
# Download and unpack the stack executable
- mkdir -p ~/.local/bin
- export PATH=$HOME/.local/bin:$PATH
- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
Run Code Online (Sandbox Code Playgroud)

当我将它们推送到git时,测试无法运行,travis CI尝试构建我的repo,但是当我检查日志时它说它无法找到堆栈命令.

但是在我的配置文件中,我指定它来安装堆栈.

我不确定为什么会这样,任何帮助将不胜感激?

continuous-integration haskell hunit travis-ci

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

在haskell中MapM的结果?

在交互模式下使用mapM时:调用mapM putStrLn ["random","Text"] 输出是

random
text
[(),()]
Run Code Online (Sandbox Code Playgroud)

但是当我从脚本调用相同的函数然后运行脚本时:

main = do        
    handle <- openFile "todo.txt" ReadMode  
    (tempName, tempHandle) <- openTempFile "." "temp"  
    contents <- hGetContents handle
    let todoTasks = lines contents
        numberedTasks = zipWith (\n line -> show n ++ "-" ++ line) [0..] todoTasks      
    putStrLn "These are your TO-DO items:"  
    mapM putStrLn numberedTasks -- <<<<<<<< HERE <<<<<<<<
    putStrLn "Which one do you want to delete?"     
    numberString <- getLine     
    let number = read numberString     
        newTodoItems = delete (todoTasks !! …
Run Code Online (Sandbox Code Playgroud)

io haskell ghci

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

Haskell Monads的实现

我最近在读书时学习了一个haskell,我遇到了这样的表达方式:

[1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch)
Run Code Online (Sandbox Code Playgroud)

此表达式返回结果

[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

所以我明白列表的monadic绑定实现如下

xs >>= f = concatMap f xs
Run Code Online (Sandbox Code Playgroud)

采取表达的前半部分即:

[1,2] >>= \n -> ['a', 'b']
Run Code Online (Sandbox Code Playgroud)

['a','b','a','b']根据我的理解进行评估,然后将其输入函数:(\ch -> return (n , ch)).

我不明白的是如何将列表中的值1,2分配给n,然后编译器如何记录它然后在最后一个函数中将其分配给n?

syntax monads lambda haskell list

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

getLine如何在haskell中工作?

看看Haskell Prelude中的定义getLine,我得到了递归的工作方式,在你点击换行符之前你一直要求一个字符,然后你构建一个列表然后返回包含在IO中.

但是我的问题是这些return语句在这种情况下是如何工作的,特别是return (c:....:return "")在你遇到基本情况时如何工作.你如何return ""进入清单?

io haskell functional-programming getline

0
推荐指数
1
解决办法
652
查看次数