我发现div和之间存在一种非常奇怪的不一致/.
*ghci> :t 1 `div` 0
1 `div` 0 :: Integral a => a
*ghci> :t 1 / 0
1 / 0 :: Fractional a => a
*ghci> 1 / 0
Infinity
*ghci> 1 `div` 0
*** Exception: divide by zero
Run Code Online (Sandbox Code Playgroud)
我很惊讶地注意到零除以零导致Infinity,而div正确导致异常.A NaN也可以接受/,但为什么Infinity呢?这样的结果没有数学上的理由.你知道原因吗?
在haskell平台的许多功能的实现中有一个非常常见的模式困扰我,但我无法找到解释.它是关于使用嵌套函数进行优化的.
嵌套函数在where子句用于进行尾递归的原因对我来说非常清楚(如长度),但内部函数与顶级函数具有完全相同类型的目的是什么?例如,它发生在Data.Set模块的许多功能中,如下所示:
-- | /O(log n)/. Is the element in the set?
member :: Ord a => a -> Set a -> Bool
member = go
where
STRICT_1_OF_2(go)
go _ Tip = False
go x (Bin _ y l r) = case compare x y of
LT -> go x l
GT -> go x r
EQ -> True
#if __GLASGOW_HASKELL__ >= 700
{-# INLINABLE member #-}
#else
{-# INLINE member #-}
#endif
Run Code Online (Sandbox Code Playgroud)
我怀疑它可能与memoization有关,但我不确定.
编辑 …
给定两个monad,Monad m并且Monad n,我想转换m (n a)成n (m a).但似乎是因为两者没有通用的方法(>>=)和return交易只有一个单子类型,虽然(>>=)允许提取一个单子的内容,则必须收拾他们回到同一个单子类型,以便它可以是一个结果值.
但是,如果我们设置m为固定类型,则工作变得容易.以Maybe为例:
reorder :: (Monad n) => Maybe (n a) -> n (Maybe a)
reorder Nothing = return Nothing
reorder (Just x) = do
x' <- x
return $ Just x'
Run Code Online (Sandbox Code Playgroud)
或者列表:
reorder :: (Monad n) => [n a] -> n [a]
reorder [] = return []
reorder (x:xs) = do
x' <- x
xs' <- …Run Code Online (Sandbox Code Playgroud) 我编写了一个模块,为了运行导入模块的主代码需要具有语言扩展名,{-# LANGUAGE OverloadedStrings #-}或者当编译程序时需要给出选项.
如果我{-# LANGUAGE OverloadedStrings #-}在模块中包含这是无法解决的,用户仍然需要在她的代码或编译时执行相同的操作.
有没有什么方法可以在实际模块中做"某事",以便从最终用户解决这个问题,所以说"隐藏"所需的语言扩展?
我刚刚阅读了monad的创意使用文章,其中包含非常有趣的想法和参考资料,所以我很好奇:箭头怎么样?我不是在寻找关于基础知识或"标准"用途的个人观点或参考资料(如monads vs箭头或帮助理解haskell中的箭头),而是寻找智能和/或非平凡应用程序的参考列表(也许在研究论文?).谢谢.
我正在考虑通过1或2个实验室教授使用软件交易记忆来进行大学课程的可能性.我只知道Haskell的STM,但该课程的学生可能从未听说过它.
我已经在网上或其他问题中找到了一些此类库的列表(例如,http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B).我检查出来,当你阅读这一点,但很多人似乎并不有一个非常漂亮的文档(大部分是研究原型的论文中只是含糊地描述,我宁愿教的东西比较习惯,有据可查).此外,维基百科提供的许多链接都是悬空的.
总而言之,STM的实施是针对工业项目(或至少是非玩具项目,以确保一定的质量水平)并且有详细记录(为学生提供一些好的指示)?
编辑:我不是课程的老师,我只是帮他实验室.当然,学生之前将学习并发和分布式算法的基础知识.这只是一个想法,在课程结束时提出不同的建议.
我认为原则上haskell的类型系统会禁止f :: a -> IO b从纯粹的函数中调用不纯的函数(即),但今天我意识到通过调用它们return它们编译得很好.例如:
h :: Maybe ()
h = do
return $ putStrLn "???"
return ()
Run Code Online (Sandbox Code Playgroud)
现在,h可能在monad中工作,但它仍然是一个纯粹的功能.编译和运行它只是Just ()按照预期返回,而不实际执行任何I/O. 我认为haskell的懒惰将事物放在一起(即putStrLn不使用返回值 - 并且不能因为它的值构造函数被隐藏而且我无法模拟匹配它),但为什么这个代码合法?还有其他原因可以让这个允许吗?
作为奖励,相关问题:一般来说,是否有可能禁止monad的行为从其他行为中执行?怎么样?
我将开始一个关于自动机和图论的科学项目,我正在寻找一个支持以下功能的图库:
我知道Boost Graph Library,但据我从文档中理解,它缺少子图测试.
所以,我的问题是:哪个是最好的c ++图形库,好吗?他们不需要为我需要的每个功能提供支持,我知道现有的库当然没有完全满足我的需求.
我需要将并发系统放在一起,并Control.Concurrent.Chan在线程之间共享一个.将只有一个消费者和许多生产者.看看Chan文档,我没有看到任何关于可能在同一个频道上工作的消费者和制作者数量的警告,并且源代码似乎使用MVars 的默认"安全"访问器,因此我认为它应该是安全的.假设不应该有限制,但我不确定.所以,我的问题是......你知道haskell频道对于多个读者和制作人来说是否安全(一般情况下),对吗?
我unsafePerformIO最近一直在读,我想问你一件事.我很清楚,真正的语言应该能够与外部环境进行交互,因此unsafePerformIO有些合理.
但是,据我所知,我不知道有什么快速的方法来了解一个看似纯粹的(从类型判断)接口/库是否真的纯粹没有检查代码搜索调用unsafePerformIO(文档可以省略到提到它).我知道只有当你确定引用透明度得到保证时才应该使用它,但我想知道它.
haskell ×8
monads ×2
arrows ×1
atomic ×1
atomicity ×1
c ×1
c++ ×1
concurrency ×1
division ×1
graph-theory ×1
isomorphism ×1
java ×1
math ×1
optimization ×1
subgraph ×1
transactions ×1