小编Mic*_*ard的帖子

在Haskell中编写Perl代码生成器有哪些步骤?

鉴于Perl 5不符合BNF,我对如何思考这个问题感到茫然.有人可以提出一些建议让我以正确的方式考虑这个问题吗?

haskell code-generation

2
推荐指数
1
解决办法
242
查看次数

惯用的Haskell是否尝试消除对fst和snd的对操作,因为它有head,init,tail等?

这是一个不适合我的功能,我想我需要摆脱fst.

flagHolidays :: [(C.Day,Availability)] -> Handler [(C.Day,Availability)]
flagHolidays dayPairs = do
   let days = map fst dayPairs
       yepNope = Prelude.map isHoliday days
       availability = Prelude.map flagAvailability yepNope
   return $ Prelude.zip days availability
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一方法是进行非常难看的模式匹配(x,y):(xs,ys).删除是否fst有意义?如果是这样,那么对这个对列表进行模式匹配的最佳方法是什么?

haskell

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

有序的乐趣

我有一组五个函数,可以称为五种方法之一.我是这样用patern-matching表达的,

type Configure = ReaderT Config IO ()
data Step = PreVal
          | PreProc
          | Proc
          | PostProc
          | PostVal

foo :: Step -> Configure
foo PreVal = do some stuff
foo PreProc = do some stuff
Run Code Online (Sandbox Code Playgroud)

等等,barbaz设置相似

我知道如何用来sequence调用一系列动作.鉴于[Step],我怎么能去打电话[foo,bar,baz].按顺序,同时也调用每个可能的步骤.

所以它应该这样做 foo PreVal foo PreProc ...依此类推 bar Preval bar PreProc ...等等 baz......

haskell

2
推荐指数
1
解决办法
132
查看次数

是否有可能为同一个构造函数有不同的行为?

我正在写一个SQL解释器.我需要在编译时区分不正确的表达式和运行时错误.

我会给你一个应该是格式良好的例子,但可能在运行时失败.

SELECT $ [ColumnName "first_name" `AS` "name"] `FROM` TABLE "people.csv" `WHERE` (ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)

我想专注于表达:

(ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)

这应该通过类型检查器.但是,说"年龄"并不包含可以表达为a的东西LiteralInt.

所以我想要Gte产生类似的东西IO Bool(暂不考虑异常处理).

但我并不总是需要Gte制作一个IO Bool.如果我有这样的事情:

(LiteralInt 40 `Gte` LiteralInt 10)我只需要一个Bool.或类似的东西: (LiteralInt 40 `Gte` LiteralBool True)需要在编译时失败.

所以,我一直在玩弄数据系列和GADT,并且已经落下了许多死胡同,如果我解释它们就会混淆这种情况.

我的问题是否有意义,如果是这样,我可以通过一个探索的途径来解决问题?

haskell dependent-type

2
推荐指数
1
解决办法
100
查看次数

使"单身人士论文"更新.如何使用singleton库实现AChar数据类型

感谢Benjamin Hodgson,我已经开始实现一个类型安全的SQL-Interface,从这个 stackoverflow问题开始.

据我所知,我已经开始阅读单身纸.我发现看到工作代码有很多帮助,并努力查看提供的代码是否有效.但是,代码已有三年历史,需要进行一些更新.大!现在我开始学习一些东西.这是第一步,使用type-literal字符串删除提升类型的AChar.

来自原始代码 singletons-examples/DatabaseStar.hs

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
{-# Language PolyKinds, DataKinds, TemplateHaskell, TypeFamilies,
    GADTs, TypeOperators, RankNTypes, FlexibleContexts, UndecidableInstances,
    FlexibleInstances, ScopedTypeVariables, MultiParamTypeClasses #-}

module DatabaseStar where

import Data.Singletons
import Data.Singletons.CustomStar
import Data.Singletons.TH

$(singletons [d|
-- A re-definition of Char as an algebraic data type.
-- This is necessary to allow for promotion and type-level Strings.
  data AChar = CA | CB | CC | CD | CE | CF | CG …
Run Code Online (Sandbox Code Playgroud)

singleton haskell dependent-type

2
推荐指数
1
解决办法
74
查看次数

这个"无实例"错误的解决方案是什么?

我创建了描述二叉树的新类型

data BinTree a = Null | Num a (BinTree a) (BinTree a)
deriving (Show)
Run Code Online (Sandbox Code Playgroud)

并创建了以下功能:

treehandle :: BinTree a -> Bool
treehandle a = True
Run Code Online (Sandbox Code Playgroud)

检查至少输入值.

当我输入值Null时,程序输出结果成功,但我无法输入二叉树.我这样试试:

treehandle (5 (Null) (Null))
Run Code Online (Sandbox Code Playgroud)

但获得:

<interactive>:66:13:
No instance for (Num (BinTree a1 -> BinTree a2 -> BinTree a0))
  (maybe you haven't applied enough arguments to a function?)
  arising from the literal ‘5’
In the expression: 5
In the first argument of ‘treehandle’, namely ‘(5 (Null) (Null))’
In the expression: treehandle (5 (Null) …
Run Code Online (Sandbox Code Playgroud)

haskell

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

具有上下文的Haskell数据类型

我想为Vertex编写基本实现。

data Point a = Point a a

class XY c where

    x :: c a -> a

    y :: c a -> a

class XY c => Vertex c where

    translate :: c a -> c a -> c a

    scale :: a -> c a -> c a

    rotate :: a -> c a -> c a

instance XY Point where

    x (Point first second) = first

    y (Point first second) = second

instance Vertex Point where

    translate …
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
109
查看次数

Haskell程序运行非常慢

我编写了第一个计算素数的程序。但是它运行得很慢,我不知道为什么。我用Java编写了类似的代码,对于n = 10000,Java程序无需花费任何时间,而Haskell程序则需要2分钟。

import Data.List
main = do
    print "HowManyPrimes? - OnlyInteger"
    inputNumber <- getLine
    let x = (read inputNumber :: Int)
    print (firstNPrimes x)

-- prime - algorithm
primeNumber:: Int -> Bool
primeNumber 2 = True
primeNumber x = primNumberRec x (div x 2)

primNumberRec:: Int -> Int -> Bool
primNumberRec x y
      |y == 0 = False
      |y == 1 = True 
      |mod x y == 0 = False
      |otherwise = primNumberRec x (y-1)

-- prime numbers till …
Run Code Online (Sandbox Code Playgroud)

performance haskell functional-programming

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

如何将函数调用的值存储到变量

我有此功能,需要检查gdc数字的[1..n]n是否正确== 1,然后进行一些计算。所以我被困住了,因为我找不到将n的初始值存储到变量的方法。

例如,如果我调用该函数与数字7其递归所以n变得6然后5等等所以我不能gdc正确; 例如1-7然后2 - 7然后3 -7。您知道如何存储nto a变量的值吗?

myproduct :: Integer->Integer

myproduct 0 = 1
myproduct n  
  |gcd n (n from first call)  /= 1 = myproduct (n-1) 
  |otherwise = x
  where 
    x = n * myproduct (n - 1)
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
84
查看次数

Haskell - 将整数列表映射到它们的平方根

我创建了一个小函数,将整数列表映射到它们的平方根。代码本身很简单:

f x = map sqrt [1..x]
Run Code Online (Sandbox Code Playgroud)

使用默认类型推断,它可以成功加载,但该函数可以接受Floating类型类值,而我只是希望它接受Integers。所以我在它上面添加了一个类型注释。

f :: (Integral a, Floating b) => a -> [b]
f x = map sqrt [1..x]
Run Code Online (Sandbox Code Playgroud)

出乎我的意料,加载失败。在 GHCi 的 REPL 中抛出错误:

1.hs:48:7: error:
    • Couldn't match type ‘a’ with ‘b’
      ‘a’ is a rigid type variable bound by
        the type signature for:
          f :: forall a b. (Integral a, Floating b) => a -> [b]
        at 1.hs:47:1-41
      ‘b’ is a rigid type variable bound by
        the type signature …
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
144
查看次数