用于生成列表列表的函数的类型签名?

时间:2015-10-28 09:10:01

标签: list haskell

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]]

2 个答案:

答案 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}来做}:

[[]]