我是哈斯克尔的新手,仍然不知道如何处理他们的类型系统。我的问题是我在玩
序列
好好学你哈斯克尔
. 功能如下:
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA = foldr (liftA2 (:)) (pure [])
binner :: Int -> [Int -> Int]
binner n = (map (\x -> bin x) [n, (n-1) .. 1])
where bin n = (`mod` 2) . (`div` 2^(n-1))
我可以单独使用这些函数。例如,以下内容在GHCi中非常有用:
sequenceA (binner 4) 10
如果我在GHCi中键入以下内容,
:t (sequenceA (binner 4))
(sequenceA (binner 4)) :: Int -> [Int]
但是,我不知道如何组合这些函数。直觉上,我应该可以使用GHCi显示的相同类型来执行以下操作:
binner :: Int -> [Int]
binner n = foldr (liftA2 (:)) (pure []) $ (map (\x -> bin x) [n, (n-1) .. 1])
where bin n = (`mod` 2) . (`div` 2^(n-1))
但编译时会出现一个错误:
无法将类型[a0]与Int匹配
需要类型:[Int]
我试过修改类型声明,但还没有找到解决方法。
谢谢你的帮助!