我一直在尝试开始在Scotty中编写一个Web应用程序,但是当我尝试运行服务器时,我遇到了依赖冲突.这是我的代码:
{-# LANGUAGE OverloadedStrings #-}
module Site where
import Web.Scotty
import Control.Monad.IO.Class
import qualified Data.Text.Lazy.IO as T
-- Controllers
indexController :: ActionM ()
indexController = do
index <- liftIO $ T.readFile "public/index.html"
html index
routes :: ScottyM ()
routes = do
get "/" indexController
main :: IO ()
main = do
scotty 9901 routes
Run Code Online (Sandbox Code Playgroud)
当我使用它运行时runhaskell Site.hs,我收到以下错误:
Site.hs:12:10:
Couldn't match expected type `text-0.11.2.3:Data.Text.Lazy.Internal.Text'
with actual type `Data.Text.Lazy.Internal.Text'
In the first argument of `html', namely `index'
In a …Run Code Online (Sandbox Code Playgroud) 我正在对我的程序中的类型进行原型设计和处理,我目前只ghc --make在想要进行类型检查时使用.但是,此命令还花费时间编译和链接我不需要的实际可执行文件.是否有一些我可以传递的标志ghc告诉它只做类型检查?
免责声明:我对ghc编译管道知之甚少,但我希望通过这篇文章了解更多关于它的信息,例如,如果将命令与功能进行比较与代码编译相关.
如您所知,循环展开通过复制其中的代码来减少循环中的迭代次数.这提高了性能,因为它减少了跳转次数(以及与之相关的惩罚)和AFAIR,创建了更大的代码块,为更好的寄存器重命名优化留出了空间.
我想知道,是否可以使用Loop Unrolling进行函数式编程?我们可以"展开"一个函数,打开/扩展它的定义,首先减少对所述函数的调用次数和/或创建更大的代码块 - 然后为更多的代码重写优化留出空间(比如寄存器重命名,或者一些FP)当量)?
可以"展开"或"扩展"函数定义的东西,例如使用函数评估(可能与某种策略混合),以便在空间与时间之间进行权衡.
我想到的一个例子:
map1 _ [] = []
map1 f (x:xs) = (f x): map f xs
Run Code Online (Sandbox Code Playgroud)
将展开
map2 _ [] = []
map2 f (x:x1:xs) = (f x):(f x1):map2 f xs
map2 f (x:xs) = (f x): map2 f xs
Run Code Online (Sandbox Code Playgroud)
再一次:
map4 _ [] = []
map4 f (x:x1:x2:x3:xs) = (f x):(f x1):(f x2):(f x3):map4 f xs
map4 f (x:x1:x2:xs) = (f x):(f x1):(f x2):map4 f xs
map4 …Run Code Online (Sandbox Code Playgroud) 一个非常受欢迎的monad解释如下:
http://blog.sigfpe.com/2007/04/trivial-monad.html
除了这部分我得到的一切:
bind :: (a -> W b) -> (W a -> W b)
bind f (W x) = f x
Run Code Online (Sandbox Code Playgroud)
我有Haskell的基本知识(很长一段时间没用过它),但这个签名看起来不对.
我安装了GHC并检查了它的想法 - 结果它认为我做了什么,即:
:t bind
bind :: (t1 -> t) -> W t1 -> t
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我这样做:
import qualified Data.ByteString.Lazy.Char8 as BS
main :: IO ()
main = do
let filename = "sample.txt"
text <- BS.readFile filename
let res = BS.take 1000 $ text
print res
Run Code Online (Sandbox Code Playgroud)
当我通过分析运行它时,它给了我:
162,048 bytes allocated in the heap
2,472 bytes copied during GC
59,688 bytes maximum residency (1 sample(s))
22,232 bytes maximum slop
156 MB total memory in use (0 MB lost due to fragmentation)
Run Code Online (Sandbox Code Playgroud)
我读的文件大约是50K字节.为什么需要60K字节的内存(最大驻留时间)?我也尝试过String和Lazy文本.这是相同的图片.我认为Haskell在某种程度上是将整个文件读入内存或只是分配与文件长一样多的内存.我怎么能阻止这个?我想从它只读N字节,不想浪费这么多的内存.
在packages-haskell2010/System/IO.hs中,我们有以下行:
import "base" System.IO hiding (openFile, hWaitForInput)
Run Code Online (Sandbox Code Playgroud)
导入时import未记录此形式(其后跟一个字符串,然后是模块名称).假设String(在本例中)只是引用一个目录,我是否正确?"base"
我正在编写一个程序来读取和写入支持多种像素类型的图像(即RGB,CMYK,灰度等).这些像素类型可以使用不同类型的组件,如下所示:
class (Storable c) => PixelComponent c where
blackWhite :: c -> (c, c)
toInt :: c -> Int
toRealFrac :: (RealFrac a) => c -> a
fromComponent :: (PixelComponent a) => a -> c
instance PixelComponent CUChar where
blackWhite x = (minBound x, maxBound x)
toInt = id
toRealFrac = fromIntegral
fromComponent x = ???
instance PixelComponent CFloat where
black = 0.0
white = 1.0
toInt = truncate
toReal = id
fromComponent x = ???
class (Storable pix) => …Run Code Online (Sandbox Code Playgroud) GHC 7.8现在默认动态链接.FAQ说这要求GHC也加载动态对象而不是静态对象.现在我的问题是:为什么会这样?为什么GHC不能继续加载静态对象,为什么GHC本身如何联系起来呢?
据称列表被定义为:data List a = Null | Cons a (List a),但它具有我们都知道的特殊语法.我可以看到如何:只是Cons类型构造函数的别名,但1)这个语法实现的方式/位置2)我可以为其他数据类型定义我自己的特殊语法,就像[whamlet|Hello World!|]Yesod使用的那样.
谢谢.
我生成了一些haskell代码(在haskell中),我需要能够检测与haskell关键字冲突的名称.是否有某个地方以编程方式检查String是否是Haskell关键字?
我当然可以自己编制它们的列表,但我不喜欢重新发明轮子.此外,如果引入新关键字(通过扩展或新规范),我希望此列表自动更新.