小编ham*_*mar的帖子

为什么不依赖键入?

我看到几个消息来源反映了"Haskell逐渐成为一种依赖型语言"的观点.暗示似乎是随着越来越多的语言扩展,Haskell正朝着这个方向漂移,但还没有.

基本上我想知道两件事.首先,很简单,"作为一种依赖型语言"究竟意味着什么?(希望没有太过技术性.)

第二个问题是......有什么缺点?我的意思是,人们知道我们正朝着这个方向前进,所以必须有一些优势.然而,我们还没有,所以必须有一些下行阻止人们一路走下去.我的印象是问题是复杂性急剧增加.但是,并不是真正了解依赖打字是什么,我不确定.

知道的是,每次我开始阅读一种依赖类型的编程语言时,文本都是完全不可理解的......大概这就是问题所在.(?)

haskell type-systems dependent-type

159
推荐指数
4
解决办法
1万
查看次数

重做仅合并一个文件

我正处于大型合并的中间,我已经习惯git mergetool了解决所有冲突,但我还没有提交,因为我想先确保合并是好的.

事实证明,我在解决一个文件中的冲突时犯了一个错误,我想用git mergetool该文件重做冲突解决方案.由于这是一个大型合并,我想避免重做所有其他文件的合并,因为据我所知,我将不得不这样做git merge --abort.

我知道我可以手动编辑文件,但这将非常繁琐,重做git mergetool操作会更容易.这可能吗?

git merge

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

Haskell中的异常处理

我需要帮助来理解三个Haskell函数的用法

  • 试试(Control.Exception.try :: Exception e => IO a -> IO (Either e a))
  • catch(Control.Exception.catch :: Exception e => IO a -> (e -> IO a) -> IO a)
  • handle(Control.Exception.handle :: Exception e => (e -> IO a) -> IO a -> IO a)

我需要知道几件事:

  1. 我什么时候使用哪个功能?
  2. 如何使用此函数的一些简单示例?
  3. 捕获和处理之间的区别在哪里?它们具有几乎相同的签名,只有不同的顺序.

我会写下我的试验,希望你能帮助我:

尝试

我有一个例子:

x = 5 `div` 0
test = try (print x) :: IO (Either SomeException ())
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如何设置自定义错误输出?

  2. 我该怎么做才能将所有错误都设置为SomeException,所以我不必编写 :: IO (Either SomeException())

捕获/试

你能给我看一个自定义错误输出的简短例子吗?

haskell exception-handling

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

重复fmap的乐趣

我在玩弄玩家,我发现了一些有趣的东西:

平凡的,id可以在类型中实例化(a -> b) -> a -> b.

使用我们拥有的列表仿函数fmap :: (a -> b) -> [a] -> [b],它与之相同map.

((->) r)函子(from Control.Monad.Instances)的情况下,fmap是函数组合,所以我们可以实例化fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]],这相当于(map . map).

有趣的是,fmap八次给我们(map . map . map)!

所以我们有

0: id = id
1: fmap = map
3: fmap fmap fmap = (map . map)
8: fmap fmap fmap fmap …
Run Code Online (Sandbox Code Playgroud)

haskell functor

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

什么是数据......在Haskell中意味着什么?

我在omegagb的devlog上看到了这个片段:

data ExecutionAST result where
  Return :: result -> ExecutionAST result
  Bind :: (ExecutionAST oldres) -> (oldres -> ExecutionAST result) ->
          ExecutionAST result
  WriteRegister :: M_Register -> Word8 -> ExecutionAST ()
  ReadRegister :: M_Register -> ExecutionAST Word8
  WriteRegister2 :: M_Register2 -> Word16 -> ExecutionAST ()
  ReadRegister2 :: M_Register2 -> ExecutionAST Word16
  WriteMemory :: Word16 -> Word8 -> ExecutionAST ()
  ReadMemory :: Word16 -> ExecutionAST Word8
Run Code Online (Sandbox Code Playgroud)

什么data ... where意思?我认为该关键字data用于定义新类型.

syntax haskell gadt

46
推荐指数
2
解决办法
3231
查看次数

如何调试Haskell代码?

我有个问题.我写了一个很大的Haskell程序,它始终适用于小输入.现在,当我想测试它并生成更大的输入时,我总是收到消息:

HsProg: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)

我用过Prelude.head很多次了.我该怎么做才能找到更多或获得更好的错误输出以获得它发生的代码行?

debugging haskell

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

新手和州/ ST相关问题的STArray文档

我很难STArray通过Google找到的文档和其他howtos /讨论来理解.我在下面有一些更相关的问题.

根据文档,STArrays是

ST monad中的可变盒装和未装箱阵列.

这给了我一个印象,那STArray就是用作在函数之间传递的状态(假设你有一个必须经常更新的向量).

显然,这使用的方式不同:

ST s (STArray s a e)
Run Code Online (Sandbox Code Playgroud)

s这里的州是什么?如果它是在内部使用的,那么为什么这不会被用户隐藏?

这也意味着,如果我们想要将一个STArray s Int Int被传递为状态,那么就可以定义

type StateArray a = Control.Monad.State (ST s (STArray s Int Int)) a
Run Code Online (Sandbox Code Playgroud)

这看起来相当麻烦.

最后,

  • ST和之间有什么区别State
  • 什么是STArrayIOArray,如果STIO是否意味着"内部"使用?

谢谢!!

arrays state haskell higher-rank-types

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

在Haskell中应该避免使用表示法吗?

大多数Haskell教程都教授IO使用do-notation.

我也开始使用do-notation,但这使得我的代码看起来更像是一种命令式语言而不是FP语言.

本周我看到一个教程使用IO <$>

stringAnalyzer <$> readFile "testfile.txt"
Run Code Online (Sandbox Code Playgroud)

而不是使用 do

main = do
    strFile <- readFile "testfile.txt"
    let analysisResult = stringAnalyzer strFile
    return analysisResult
Run Code Online (Sandbox Code Playgroud)

并且日志分析工具没有完成do.

所以我的问题是" 在任何情况下我们都应该避免使用记号吗? ".

我知道do在某些情况下可能会使代码变得更好.

另外,为什么大多数教程都教IO do

在我看来<$>,<*>使代码更多FP比IO.

haskell

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

Haskell中内置的阶乘函数

我知道这听起来像一个愚蠢的问题,但这里是:Haskell中是否有内置因子?

Google给了我关于Haskell的教程,解释了我如何自己实现它,而且我在Hoogle上找不到任何东西.我不想每次需要时都重写它.

我可以product [1..n]用作替代品,但是有一个真正的Int -> Int阶乘内置函数吗?

haskell factorial

33
推荐指数
3
解决办法
3万
查看次数

为什么分隔的连续原语名为"shift"和"reset"?

我想(一般来说)我的理解shiftreset意思.但是我不明白他们为什么如此命名?什么shiftreset分隔继续原语与英语中的"移位"和"重置"单词有什么关系?

continuations scala delimited-continuations

32
推荐指数
2
解决办法
1595
查看次数