我试着编写一个函数来对一系列数据做任何事情.
//For stl containers
template<typename T>
void foo(T x){
for(auto iter=x.begin();iter!=x.end();++iter)
do_something(*iter);
}
Run Code Online (Sandbox Code Playgroud)
这个功能是为了操作STL容器而设计的,没关系.但我想要另一个版本的C阵列.所以我尝试了这个:
//For C-array
template<typename T,size_t N>
void foo(T x[N]){
//blabla
}
//Error
Run Code Online (Sandbox Code Playgroud)
我读过"阵列的部分模板专业化"(以及其他几个相关的帖子),但它是用于类模板的.而且我也知道,当你专注于一个功能模板时,你实际上正在超载它.无论如何,该帖子中的解决方案无法在此实施.
我可以做任何(或者没有)方式吗?:-)感谢你容忍我糟糕的英语和thx以获得帮助.
我正在研究monad变形金刚,我读了这篇关于如何避免lifts的帖子.
我的想法是,MonadIO有单子在其中IO可以嵌入,并MonadWriter w有单子在其中WriterT w可以嵌入.所以我编写了下面的代码(读取,累积和记录数字,直到我们得到零),其中使用explicit的工作版本lift在注释中.但GHC抱怨道.我究竟做错了什么?
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.IO.Class
import Control.Monad.Writer.Class (MonadWriter)
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer
-- f :: ReaderT Int (WriterT [String] IO) Int
-- m1 = ReaderT, m2 = WriterT
f :: (MonadWriter [String] m1, MonadIO m2) => m1 (m2 (IO Int))
f = do
s <- liftIO getLine
tell ["Input: " ++ s] -- lift $ tell ["Input: " ++ s]
let …Run Code Online (Sandbox Code Playgroud) 我有这样的文件结构:
--- Database.hs ---
data Database = ...
...
--- User.hs ---
import Database
addUser :: Update Database ()
...
--- Post.hs
import Database
addPost :: Update Database ()
...
Run Code Online (Sandbox Code Playgroud)
问题是,我要叫makeAcidic ''Database [...]两个User.hs,并Post.hs让自己的职能酸性,但makeAcidic在同一时间产生IsAcidic的实例为Database这样GHC抱怨重复实例声明.
如:
extract (f x) = x
Run Code Online (Sandbox Code Playgroud)
我想要做的是从函数或类型构造函数中提取参数,例如
extract succ 4 = 4
extract Just 4 = 4
Run Code Online (Sandbox Code Playgroud)
PS.extract(fx)= f也不起作用.
我想定义一个函数,<-?来检查一个元素是否在list/set/map中.
module Test where
import qualified Data.Map as Map
import qualified Data.Set as Set
class Memberable a where
(<-?) :: b -> a -> Bool
instance Memberable [x] where
(<-?) = elem
instance Memberable (Map.Map k v) where
(<-?) = Map.member
instance Memberable (Set.Set x) where
(<-?) = Set.member
Run Code Online (Sandbox Code Playgroud)
b类声明中的类型变量应该是我想要检查的元素的类型.但是,这对Haskell不起作用.
Test.hs:8:13:
Couldn't match type 'b' with 'x'
'b' is a rigid type variable bound by
the type signature for (<-?) :: b -> [x] -> Bool at …Run Code Online (Sandbox Code Playgroud) 我在最坏情况下的输入(反向顺序列表)和随机输入上对插入排序进行基准测试。
import Control.Monad
import Data.List
import System.Random
import Control.Exception
import Control.DeepSeq
import Criterion.Main
--- Sorting ---
insertionSort :: (Ord a) => [a] -> [a]
insertionSort [] = []
insertionSort (x:xs) = x `insert` (sort xs)
--- Generators ---
worstCaseGen :: Int -> [Int]
worstCaseGen n = [n, n-1..1]
bestCaseGen :: Int -> [Int]
bestCaseGen n = [1..n]
randomGen :: Int -> StdGen -> [Int]
randomGen n = take n . randoms
--- Testing ---
main = do
gen <- newStdGen …Run Code Online (Sandbox Code Playgroud) //a class template to do something to STL container
template<typename T/*should be a STL container*/,typename Ele/*the type of element*/>
struct foo{
T a_container_with_an_element(){
T con;
Ele e;
con.push_back(++++e);
return con;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,将元素的类型放入模板参数是非常愚蠢的,因为它已经包含在容器的类型中.
那么,从T中获取元素的类型是否有任何魔力?
很多Thx :-)
Nothing的类型可能是Maybe Int,为什么不能与另一个相比Maybe Int?
为什么Nothing< Just 4通过?
如果它是链表,为什么它不支持push_back?
如果它只是数组,为什么在下标时需要线性时间?
感谢您的帮助.
编辑:我们可以在这样的列表前面添加元素1:[2,3],这是push_front; 但是我们不能这样做:[2,3]:4那是push_back.
PS.实际上我从C++的STL借用了push_front/back