小编use*_*038的帖子

[]类型的特殊运行时表示?

考虑长度索引向量的简单定义:

data Nat = Z | S Nat 

infixr 5 :> 
data Vec (n :: Nat) a where 
  V0 :: Vec 'Z a 
  (:>) :: a -> Vec n a -> Vec ('S n) a 
Run Code Online (Sandbox Code Playgroud)

我自然会在某些时候需要以下功能:

vec2list :: Vec n a -> [a]  
Run Code Online (Sandbox Code Playgroud)

但是,这个功能实际上只是一个奇特的身份.我相信这两种类型的运行时表示是相同的,所以

vec2list :: Vec n a -> [a]  
vec2list = unsafeCoerce 
Run Code Online (Sandbox Code Playgroud)

应该管用.唉,它没有:

>vec2list ('a' :> 'b' :> 'c' :> V0)
""
Run Code Online (Sandbox Code Playgroud)

每个输入只返回空列表.所以我认为我的理解是缺乏的.为了测试它,我定义了以下内容:

data List a = Nil | Cons a (List a) deriving (Show) 

vec2list' :: Vec …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

10
推荐指数
1
解决办法
155
查看次数

如何将字符串解析为Haskell中的函数?

我想要一个看起来像这样的函数

readFunc :: String -> (Float -> Float)
Run Code Online (Sandbox Code Playgroud)

它的运作方式是这样的

>(readFunc "sin") (pi/2)
>1.0

>(readFunc "(+2)") 3.0
>5.0

>(readFunc "(\x -> if x > 5.0 then 5.0 else x)") 2.0
>2.0

>(readFunc "(\x -> if x > 5.0 then 5.0 else x)") 7.0
>5.0
Run Code Online (Sandbox Code Playgroud)

非常天真的方法(注意这必须编译{-# LANGUAGE FlexibleContexts #-})

readFunc :: (Read (Float -> Float)) => String -> (Float -> Float)
readFunc s = read s
Run Code Online (Sandbox Code Playgroud)

No instance for (Read (Float -> Float)) ...
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为不存在这样的实例.我理解我可以通过编写一个映射来逐字符地解析输入字符串String,Float -> …

haskell text-parsing

9
推荐指数
1
解决办法
404
查看次数

我什么时候需要打字注释?

考虑这些功能

{-# LANGUAGE TypeFamilies #-}

tryMe :: Maybe Int -> Int -> Int
tryMe (Just a) b = a
tryMe Nothing b  = b

class Test a where
    type TT a
    doIt :: TT a -> a -> a

instance Test Int where
    type TT Int = Maybe Int
    doIt (Just a) b  = a
    doIt (Nothing) b = b
Run Code Online (Sandbox Code Playgroud)

这有效

main = putStrLn $ show $ tryMe (Just 2) 25
Run Code Online (Sandbox Code Playgroud)

事实并非如此

main = putStrLn $ show $ doIt (Just …
Run Code Online (Sandbox Code Playgroud)

haskell types typeclass type-families

9
推荐指数
2
解决办法
521
查看次数

GHC抱怨类型检查器强制执行的非详尽模式

我有以下代码

{-# LANGUAGE DataKinds, GADTs, TypeOperators #-}

data Vect v a where
    Nil :: Vect '[] a
    Vec :: a -> Vect v a -> Vect (() ': v) a 

instance Eq a => Eq (Vect v a) where
    (==) Nil Nil               = True
    (Vec e0 v0) == (Vec e1 v1) = e0 == e1 && v0 == v1
Run Code Online (Sandbox Code Playgroud)

在编译或解释时,-Wall给出以下警告:

Pattern match(es) are non-exhaustive
In an equation for `==':
    Patterns not matched:
        Nil (Vec _ _)
        (Vec _ …
Run Code Online (Sandbox Code Playgroud)

haskell vector ghc non-exhaustive-patterns gadt

8
推荐指数
1
解决办法
349
查看次数

断言数据构造函数是单射的

我有以下数据类型:

{-# LANGUAGE GADTs, KindSignatures, ScopedTypeVariables, DataKinds #-}

import GHC.TypeLits
import Unsafe.Coerce

data Var (i :: Nat) where
    Var :: (Num a, Integral a) => a -> Var i
    {- other constructors .... -}
Run Code Online (Sandbox Code Playgroud)

然后我有一个Num实例:

instance Num (Var i) where
    (Var a) + (Var b) = Var (a + b)
Run Code Online (Sandbox Code Playgroud)

当然这不起作用.类型a由构造函数隐藏,因为类型Varforall (i :: Nat) a. Num a => a -> Var i.另请注意,Var构造函数不能直接使用; Vars由一个保证的智能构造函数创建Var i0 ~ Var i1 => …

haskell

8
推荐指数
1
解决办法
325
查看次数

GHC 7.8中类型级自然的行为

如果你想要按长度索引的向量,你可以这样做:

{-# LANGUAGE 
  DataKinds, GADTs, TypeOperators, TypeFamilies, StandaloneDeriving
  #-}

data N = P N | Z 

type family Add (n :: N) (m :: N) :: N
type instance Add Z     a = a
type instance Add (P a) b = P (Add a b)

infixr 5 :>
data Vect n a where 
  V0   :: Vect Z a
  (:>) :: a -> Vect n a -> Vect (P n) a

deriving instance Show a => Show (Vect n a)

concatV …
Run Code Online (Sandbox Code Playgroud)

haskell types type-level-computation

8
推荐指数
1
解决办法
367
查看次数

了解Wadler的Prettier打印机的性能特征

我正在使用contrib库中的Prettier Printer实现Idris.

当我|//|Docs 列表上与操作员折叠时,性能会迅速爆炸,即在我失去耐心之前,以下代码不会终止:

*IdrisFMT\PrettyDocs> :exec toString 0 15 $ fold (|//|) $ map text $ words "this is a long sentence with a lot of words that I can use for testing the performance of the prettier printer implementation. I need a few more words to prove my point, though."
Run Code Online (Sandbox Code Playgroud)

请注意,上面的折叠等于预定义的组合子fillCat.

如果我改为使用预定义的catcombinator(= group . vcat),它会在一秒钟内终止:

*IdrisFMT\PrettyDocs> :exec toString 0 15 $ cat $ map text …
Run Code Online (Sandbox Code Playgroud)

pretty-print idris

7
推荐指数
1
解决办法
168
查看次数

当你的算法依赖于懒惰时,如何修复由懒惰引起的空间泄漏

我有一些生成搜索树的算法:

data SearchTree a = Solution a | Contradiction | Search [ SearchTree a ]
  deriving (Show, Functor)
Run Code Online (Sandbox Code Playgroud)

该算法懒惰地生成这棵树.我还定义了一个简单的求值器,它实际上只是深度优先搜索.

simpleEval :: MonadPlus m => SearchTree a -> m a
simpleEval (Solution a) = return a 
simpleEval Contradiction = mzero 
simpleEval (Search ps) = foldr mplus mzero $ map simpleEval ps 
Run Code Online (Sandbox Code Playgroud)

我注意到我的算法产生的许多解决方案看起来像下面的搜索树:

nest :: Int -> SearchTree a -> SearchTree a 
nest 0 = id 
nest n = nest (n-1) . Search . (:[]) 

tree0 = Search ts where 
  ts = …
Run Code Online (Sandbox Code Playgroud)

performance haskell

6
推荐指数
1
解决办法
121
查看次数

什么是Scala标准API中的IO Haskell Monad等价物?

我知道在IO运算符的Scalaz中有一些几乎相同的实现putStrLn :: String -> IO (,getLine :: IO String但是我的意思是Scala标准API为什么没有这样的等价物?我知道Scala不是Haskell的纯语言,并且有副作用,但我认为这种数据类型是如此描述性和有用.我不知道Try,Option还是Either会做的工作.

haskell functional-programming scala io-monad

6
推荐指数
2
解决办法
212
查看次数

使用NixOps部署静态文件

我有一个程序,该程序取决于服务器上可用的staticconfig目录以及二进制文件。就我所知,NixOps的默认构建阶段不包括这些文件,只是编译二进制文件然后将二进制文件复制到服务器。

如何修改构建阶段,以使staticconfig目录在服务器上可用?我尝试添加:

preInstall = ''
  echo "copying static and config files"
  cp -a ../static $out/static
  cp -a ../config $out/config
'';
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有真正复制文件,而且我从没看到echo命令执行过。是NixOps使用的配置文件的要点。服务器上的错误是:

[root@pprjam:~]# systemctl status pprjam
? pprjam.service - pprjam webapp
   Loaded: loaded (/nix/store/z2s52f39p3dx8q9b06rkaqqw5mhdvnmq-unit-pprjam.service/pprjam.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2018-02-17 01:29:57 UTC; 1min 27s ago
  Process: 6917 ExecStart=/nix/store/khilhwldcbm0xm3a3bzhy6f0kwdk8w1p-pprjam-0.0.0/bin/pprjam (code=exited, status=1/FAILURE)
 Main PID: 6917 (code=exited, status=1/FAILURE)

Feb 17 01:29:51 pprjam systemd[1]: Started pprjam webapp.
Feb …
Run Code Online (Sandbox Code Playgroud)

nixos nixops

6
推荐指数
1
解决办法
372
查看次数