小编ars*_*anQ的帖子

现在实例声明中是否允许使用类型签名,而无需 InstanceSigs 语言扩展?

我注意到,当将 VS Code 与当前版本的 Haskell(GHC 9.2.1 和 HLS 1.6.1.0)一起使用时,当我在实例声明中写入类型签名时,即使我没有包含{-# LANGUAGE InstanceSigs -#}扩大。

最近是否对 Haskell 进行了更改以默认允许实例签名?

haskell

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

为什么需要`fmap` 在`Maybe Integer` 上调用`succ`?

我是 Haskell 的新手,正在研究 Collat​​z 猜想问题。所需的输出是从给定整数变为 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一个 …

haskell types functor collatz map-function

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

为什么我必须两次调用“sum”才能对“Maybe Integer”列表求和?

我为一个非常简单的练习题写了一个解决方案:

假设每个方块上的数字翻倍,计算棋盘上的小麦粒数。编写代码来显示给定方块上有多少谷物,以及棋盘上的谷物总数。

如果输入小于 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,即: …

haskell sum maybe

3
推荐指数
2
解决办法
140
查看次数

标签 统计

haskell ×3

collatz ×1

functor ×1

map-function ×1

maybe ×1

sum ×1

types ×1