我注意到,当将 VS Code 与当前版本的 Haskell(GHC 9.2.1 和 HLS 1.6.1.0)一起使用时,当我在实例声明中写入类型签名时,即使我没有包含{-# LANGUAGE InstanceSigs -#}扩大。
最近是否对 Haskell 进行了更改以默认允许实例签名?
我是 Haskell 的新手,正在研究 Collatz 猜想问题。所需的输出是从给定整数变为 1 所需的步数。这是我第一次不得不使用该Maybe类型,这可能会导致我的困惑。
我有这个工作解决方案基于另一个我发现的相同问题的解决方案:
collatz :: Integer -> Maybe Integer
collatz n
| n <= 0 = Nothing
| n == 1 = Just 0
| even n = fmap succ . collatz $ n `div` 2
| otherwise = fmap succ . collatz $ 3 * n + 1
Run Code Online (Sandbox Code Playgroud)
我不清楚的是为什么有必要fmap succ在这种情况下使用。根据我目前的理解,我希望能够调用succ递归调用的输出collatz以增加它;但是,这会引发错误:
> No instance for (Enum (Maybe Integer))
arising from a use of `succ'
Run Code Online (Sandbox Code Playgroud)
它看起来像错误有事情做与调用succ一个 …
我为一个非常简单的练习题写了一个解决方案:
假设每个方块上的数字翻倍,计算棋盘上的小麦粒数。编写代码来显示给定方块上有多少谷物,以及棋盘上的谷物总数。
如果输入小于 1 或大于 64,则函数必须返回 aMaybe Integer并返回Nothing。
square :: Integer -> Maybe Integer
square n = if (n < 1 || n > 64) then Nothing else Just (2^(pred n))
total :: Integer
total = sum (fmap sum (map square [1..64]))
Run Code Online (Sandbox Code Playgroud)
我尝试应用fmap sum到GHCI中map square(list of Maybe Integer) 的一些测试输出,并惊讶地发现它返回整数列表 (sans Just) 而不是它们的总和。所以在上面的解决方案中,我sum第二次申请实际得到总和。
我想从概念上理解为什么会这样:换句话说,为什么sum在这种情况下表现得像一个从 Maybe Ints 到 Ints 的转换器,而不是添加东西?
我已经解决了一些依赖辅助函数的类似练习,以避免对Maybe值进行计算的复杂性,也许在这种情况下,我应该只计算 的值total而不使用square,即: …