我正在学习Haskell并试图了解NonEmpty的工作原理。我写了以下代码。
module Mm (main, Bb, g) where
import Data.List.NonEmpty
g :: NonEmpty Integer -> NonEmpty Integer
g = fmap (+9)
main = g
它编译,但是当我这样做时:
b= nonEmpty [2,3]
main b
出现错误。我不明白我在哪里做错了什么!
编辑:我收到以下错误:
couldn't match expected type 'NonEmpty Integer' with actual type 'Maybe
(NonEmpty Integer)'. In the first argument of 'main' namely 'b'.
In the expression: main b
In an equation for 'it' : it = main b
答案 0 :(得分:3)
查看nonEmpty
的类型。 nonEmpty []
的结果应该是什么?
您收到类型错误,因为nonEmpty
有返回Maybe (NonEmpty a)
,或者它是部分函数(如果您尝试过,可能会在运行时崩溃)访问价值)。
有几种方法可以解决问题。一种是使用maybe
根据结果选择一个动作:
maybe (Left "List is empty") (Right . main) $ b
另一种方法是对结果进行模式匹配,假设它永远不会Nothing
。如果这个假设被证明是错误的,那么你的程序将在运行时崩溃:
let (Just b) = nonEmpty [2,3] in main b
我忽略了第三个选择是直接使用NonEmpty
的构造函数:
main $ 2 :| [3]
这可能是您正在寻找的解决方案。由于我上面所说的原因,通过列表的路线只是一个恼人的绕道而已。