bundle :: Int -> [a] -> [[a]]
bundle 0 _ = []
bundle n (x:xs) = [x:bundle (n-1) xs]
我的目标是做这样的事情
bundle 3 [1,2,3,4,5] = [[1,2,3]]
代码给我错误
Couldn't match expected type ‘[a]’ with actual type ‘a’
‘a’ is a rigid type variable bound by
the type signature for bundle :: Int -> [a] -> [[a]]
答案 0 :(得分:3)
bundle :: Int -> [a] -> [[a]]
bundle 0 _ = []
bundle n (x:xs) = [x:bundle (n-1) xs]
bundle (n-1) xs
的类型为[[a]]
。要使x : bundle (n-1) xs
有意义,x
必须是[[a]]
的元素,因此它必须是[a]
。但它只是一个a
。
换句话说,您正在尝试构建一个格式错误的列表,例如
[ 1 , [2,3] , [4,5] ]
^-- not a list
你真的想建立一个[[a]]
吗? [a]
更适合您的目标吗?
答案 1 :(得分:1)
Chi写了一些关于这个问题的文章 - 我从你的例子开始,看看它在哪里引导我。
老实说,我不明白为什么你想要第二次翘曲,但最简单的方法就是:
Caused by: javax.naming.NameNotFoundException: JmsXA -- service jboss.naming.context.java.JmsXA
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:103)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:197)
at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:241)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:183)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:179)
at javax.naming.InitialContext.lookup(InitialContext.java:411) [rt.jar:1.7.0_80]
at javax.naming.InitialContext.lookup(InitialContext.java:411) [rt.jar:1.7.0_80]
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154) [spring-context-3.0.7.RELEASE.jar:3.0.7.RELEASE]
当然这会给你<jee:jndi-lookup id="connectionFactory" jndi-name="java:/JmsXA"/>
<jee:jndi-lookup id="RequestsQueue" jndi-name="java:/jms/queue/requestQueue"/>
'bundle 0 ...'但我认为这确实是你想要的
现在当然有一些更简单的方法 - 例如,已经有一个类似的函数:bundle :: Int -> [a] -> [[a]]
bundle 0 _ = [[]]
bundle n (x:xs) = let [xs'] = bundle (n-1) xs in [x : xs']
- 它只是不会第二次包装,但是你可以用一个简单的{{1}来做}:
[[]]