我需要使用列表理解来生成这样的列表:[“ AaBB”,“ AbBB”,“ AcBB”,“ AdBB”,“ AeBB”,“ AfBB”,“ AgBB”]。但是我一直在创建表达式来解决这个问题
我尝试创建一个列表,其中每个元素都是字符串连接,类似“ A” + x +“ BB”,其中x是从“ a”开始到“ g”结束的一系列字母中的元素
module C where
genList :: [String]
genList = [ "A" ++ x ++ "BB" | x <- ["a" .. "g"]]
Run Code Online (Sandbox Code Playgroud)
因此,我期望生成一个与问题中所要求清单相似的清单。但是相反,我只是遇到了此编译错误:
Prelude> :l exC
[1 of 1] Compiling C ( exC.hs, interpreted )
exC.hs:3:41: error:
• No instance for (Enum [Char])
arising from the arithmetic sequence ‘"a" .. "g"’
• In the expression: ["a" .. "g"]
In a stmt of a list comprehension: x …Run Code Online (Sandbox Code Playgroud) 我正在学习Haskell,我刚在书中看到了这个奇怪的数据结构,看起来像这样:data ListaOrd a = a :?: (ListaOrd a) | Nulo deriving Show。据说这应该代表一个有序列表,但是我认为我并不真正理解它。我的问题是,该代码中“:?:”符号的含义是什么?
我正在研究Haskell,并被要求解决此练习:
实现一个名为NovoPred的新数据类型,该数据类型应具有一个具有相同名称的值构造函数。它还应该有一个名为runNovoPred的字段,其类型可能是-> Bool然后,为NovoPred类型创建一个Functor Contravariant实例
为了解决此问题,我提出了以下解决方案:
module Oitavo where
import Data.Functor.Contravariant
newtype NovoPred a =
NovoPred
{ runNovoPred :: Maybe a -> Bool
}
instance Contravariant NovoPred where
contramap y (NovoPred x) = NovoPred (x . y)
Run Code Online (Sandbox Code Playgroud)
您可能会注意到,该解决方案根本不起作用。Contramap需要具有以下结构:(a -> b) -> f b -> f a问题是x函数希望接收一个看起来像的值,Maybe b并且实际上正在接收一个值,b因为那是y函数返回的值。因此,这是不可能的x . y,因为x期望接收到的值与y实际返回的值不匹配。
因此,我认为我需要一种使y函数返回type值的方法Maybe b。不幸的是,我对如何执行此操作contramap一无所知,因为期望接收诸如a -> b第一个参数之类的东西而不是诸如此类a -> …