假设我有一些列表列表,[[a, b], [c], [d, e, f], ...]其中列表中的列表可以是任意长度。我已经对列表进行了排序,使得最短的列表排在第一位,并且我想生成列表中所有元素组合的列表,以便我得到一个列表[[a, c, d, ...], [a, c, e, ...], [a, c, f, ...], [b, c, d, ...], ...],即通过更改从最后一个列表中选取的元素来生成组合首先,向上移动列表以更改类似于计数的元素。
使用这个列表,我将使用列表的头部来使用惰性求值,因为我只需要 1 个满足谓词的列表。如何生成列表?
haskell functional-programming list-comprehension combinatorics nested-lists
我quoteFile在虚拟环境中遇到问题(安装了GHC 7.8.4的Debian Wheezy)。我从描述了st准报价单的面向文件的版本Text.Shakespeare.Text:
import Language.Haskell.TH.Quote (QuasiQuoter, quoteFile)
import Text.Shakespeare.Text (st)
sfFile :: QuasiQuoter
stFile = quoteFile st
Run Code Online (Sandbox Code Playgroud)
这在我的主机上工作得很好,但是,在我的虚拟环境(Docker映像)上失败并出现以下错误:
尝试运行编译时代码时发生异常:test-file.md:hGetContents:无效参数(无效字节序列)
代码:Language.Haskell.TH.Quote.quoteExp stFile“ test-file.md”
我的一点REPL调查表明,该错误发生在文本文件中的第一个unicode字符上,在我当前的情况下,这是'«'左指针双角引号:
import System.IO (IOMode(..), hGetContents, openFile, openBinaryFile, utf8)
main =
do h <- openBinaryFile "test-file.md" ReadMode
hGetContentContents h
-- Binary read works fine out-of-box.
h' <- openFile "test-file.md" ReadMode
hSetEncoding h' utf8
hGetContentContents h'
-- This works only if encoding is explicitly set, otherwise
-- it gives "invalid byte sequence" error at …Run Code Online (Sandbox Code Playgroud) 如果“ {-# LANGUAGE OverloadedStrings #-} ”包含在源文件的顶部或 package.yaml 中(我使用的是堆栈),则
length "a" -- does not compile anymore.
Run Code Online (Sandbox Code Playgroud)
但是自定义功能length'工作正常
length' :: [a] -> Int
length' xs = sum [1 | _ <- xs]
Run Code Online (Sandbox Code Playgroud)
包Data.String是进口的 - 我认为问题就在那里,但是,我有兴趣看看,如果有人有类似的问题。
堆栈和 GHC 版本:2.3.1 版,Git 修订版 x86_64 hpack-0.33.0,ghc-8.8.3
我正在使用 mac osx,但在 Linux 和 Windows 中也有同样的错误。
/Users/admin1/Haskell/PROJECTS/orig1/src/Lib.hs:13:29: error:
• Ambiguous type variables ‘t0’,
‘a0’ arising from the literal ‘"a"’
prevents the constraint ‘(IsString (t0 a0))’ from being solved.
Probable fix: use a type annotation …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Haskell 图像处理包HIP向图像添加过滤器,我能够使用ByteString包读取图像并使用 HIP 将图像转换为类型Image VS YCbCr Word8。现在,我如何从 转换Image VS YCbCr Word8为Border (Pixel cs e)or Pixel cs e?我仍在学习 Haskell 所以请保持简单。请参阅下面的代码:
addFilterJpg :: FilePath -> IO ()
addFilterJpg fc = do
case validPath fc of
Left err -> putStrLn err
Right img -> do
case readImage img of
Left err -> putStrLn err
Right img -> do
-- convert img::(Image VS YCbCr Word8) to Border (Pixel cs e)
-- apply …Run Code Online (Sandbox Code Playgroud) 我有一些类和它们的实例。该示例显示了一些无意义的类。它们的确切性质并不重要。
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
class Foo a where
foo :: a -> Int
class Bar a where
bar :: a -> String
instance Foo Int where
foo x = x
instance Foo String where
foo x = length x
instance Bar Int where
bar x = show x
instance Bar String where
bar x = x
Run Code Online (Sandbox Code Playgroud)
好的,现在我想创建一些存在类型,将这些类隐藏在某些数据类型外观后面,这样我就不必处理约束了。(我知道存在类型被认为是一种反模式,请不要向我解释这一点)。
data TFoo = forall a. Foo a => TFoo a …Run Code Online (Sandbox Code Playgroud) magnitude :: Floating a => [a] -> a
magnitude = sqrt . mag
where mag [] = 0
mag (x:xs) = x^2 + mag xs
Run Code Online (Sandbox Code Playgroud)
这应该对列表中的每个元素进行平方,然后取它们的总和,然后取平方根。很公平,但是当它只将 x 添加到列表 xs 时,这个递归函数是如何工作的?
我是 Haskell 的新手,我一直在system为我执行 shell 命令,因为我只对退出状态感兴趣。我注意到,因为我可以做这样的事情:
ls <- system "ls"
pwd <- system "pwd"
Run Code Online (Sandbox Code Playgroud)
这正确地执行了两个命令。我正在考虑执行这些命令的数组,例如
lsAndPwd <- return $ system <$> ["ls", "pwd"]
Run Code Online (Sandbox Code Playgroud)
我很惊讶这实际上并没有执行任何操作。这会编译,我检查了lsAndPwd它的类型是否正确,[IO GHC.IO.Exception.ExitCode]但从未执行过命令。这是怎么回事,我怎样才能让它发挥作用?
所以我知道如何编写代码来查看我的列表是从最小到最大排序
isSorted :: (Ord a) => [a] -> Bool
isSorted [] = True
isSorted [x] = True
isSorted (x:y:xs) = x <= y && isSorted (y:xs)
Run Code Online (Sandbox Code Playgroud)
但我想编写一个代码,告诉我我的列表是否按给定的比较运算符排序,例如我想放入
sorted (<=) [1,2,2,4,5] == True
sorted (<) [1,2,2,4,5] == False
sorted (==) [1,2,2,2,3] == False
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
假设您有一个包含以下列表的变量:
Prelude> arr = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
你也是,
Prelude> arr
[1,2,3,4,5]
Prelude> arr = tail arr
Prelude> arr
Run Code Online (Sandbox Code Playgroud)
为什么编译器现在冻结了?我试图在递归中实现这个代码语句,但这种现象阻止了我的递归正常工作——它不断返回一个空列表错误。
所以我有一个函数,称为funcA。
这是“定义”(我刚刚开始学习Haskell)。
funcA :: Quadtree -> Array (Int, Int) Word8
Run Code Online (Sandbox Code Playgroud)
一个示例是将其Quadtree作为工作解决方案并返回:
listArray ((0,0), (2,2)) [0,0,0,1,1,1,2,2,2]
Run Code Online (Sandbox Code Playgroud)
我目前正在返回[Word8]。我的问题是,是不是[0,0,0,1,1,1,2,2,2]一个[Word8],不是Word8?所以,我们的工作解决方案是形式Array (Int, Int) [Word8],对吗?它不遵循函数定义的返回格式吗?
我[0,0,0,1,1,1,2,2,2]该如何选择a [Word8]并将其制成表格Array (Int, Int) Word8?