我看到几个消息来源反映了"Haskell逐渐成为一种依赖型语言"的观点.暗示似乎是随着越来越多的语言扩展,Haskell正朝着这个方向漂移,但还没有.
基本上我想知道两件事.首先,很简单,"作为一种依赖型语言"究竟意味着什么?(希望没有太过技术性.)
第二个问题是......有什么缺点?我的意思是,人们知道我们正朝着这个方向前进,所以必须有一些优势.然而,我们还没有,所以必须有一些下行阻止人们一路走下去.我的印象是问题是复杂性急剧增加.但是,并不是真正了解依赖打字是什么,我不确定.
我所知道的是,每次我开始阅读一种依赖类型的编程语言时,文本都是完全不可理解的......大概这就是问题所在.(?)
我正处于大型合并的中间,我已经习惯git mergetool
了解决所有冲突,但我还没有提交,因为我想先确保合并是好的.
事实证明,我在解决一个文件中的冲突时犯了一个错误,我想用git mergetool
该文件重做冲突解决方案.由于这是一个大型合并,我想避免重做所有其他文件的合并,因为据我所知,我将不得不这样做git merge --abort
.
我知道我可以手动编辑文件,但这将非常繁琐,重做git mergetool
操作会更容易.这可能吗?
我需要帮助来理解三个Haskell函数的用法
Control.Exception.try :: Exception e => IO a -> IO (Either e a)
)Control.Exception.catch :: Exception e => IO a -> (e -> IO a) -> IO a
)Control.Exception.handle :: Exception e => (e -> IO a) -> IO a -> IO a
)我需要知道几件事:
我会写下我的试验,希望你能帮助我:
尝试
我有一个例子:
x = 5 `div` 0
test = try (print x) :: IO (Either SomeException ())
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
如何设置自定义错误输出?
我该怎么做才能将所有错误都设置为SomeException,所以我不必编写 :: IO (Either SomeException())
捕获/试
你能给我看一个自定义错误输出的简短例子吗?
我在玩弄玩家,我发现了一些有趣的东西:
平凡的,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) 我在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
用于定义新类型.
我有个问题.我写了一个很大的Haskell程序,它始终适用于小输入.现在,当我想测试它并生成更大的输入时,我总是收到消息:
HsProg: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)
我用过Prelude.head
很多次了.我该怎么做才能找到更多或获得更好的错误输出以获得它发生的代码行?
我很难STArray
通过Google找到的文档和其他howtos /讨论来理解.我在下面有一些更相关的问题.
根据文档,STArray
s是
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
?STArray
和IOArray
,如果ST
和IO
是否意味着"内部"使用?谢谢!!
大多数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中是否有内置因子?
Google给了我关于Haskell的教程,解释了我如何自己实现它,而且我在Hoogle上找不到任何东西.我不想每次需要时都重写它.
我可以product [1..n]
用作替代品,但是有一个真正的Int -> Int
阶乘内置函数吗?
我想(一般来说)我的理解shift
和reset
意思.但是我不明白他们为什么如此命名?什么shift
和reset
分隔继续原语与英语中的"移位"和"重置"单词有什么关系?