小编kos*_*kus的帖子

(Num a)vs Integer类型推断

考虑以下Haskell函数:

sign a
  | a < 0 = (-1)
  | a > 0 = 1
  | otherwise = 0
Run Code Online (Sandbox Code Playgroud)

当我把它加载到ghci我希望:t sign是:

sign :: (Num a, Ord a) => a -> Integer
Run Code Online (Sandbox Code Playgroud)

相反,它推断为:

*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
Run Code Online (Sandbox Code Playgroud)

同样,如果我要求整数的类型5,我期望Integer,但我得到了

*Main> :t 5
5 :: Num a => a
Run Code Online (Sandbox Code Playgroud)

我不了解Haskell的类型.问题是,如果我所知道的返回类型sign是它是Num类型类的一个实例,那么我不应该将它的返回值传递给这个函数:

double :: Integer -> Integer
double x = x * 2
Run Code Online (Sandbox Code Playgroud)

也就是说,我的 …

haskell

13
推荐指数
3
解决办法
1038
查看次数

在GHC 7.8中具有角色的代码损坏

我的一些代码被最新版本的ghc 7.8.2打破了.

GeneralizedNewtypeDeriving用来派生Data.Vector.Unbox使用以下内容的实例:

data VoxelPos     = VoxelPos
                    {-# UNPACK #-} !Int
                    {-# UNPACK #-} !Int
                    {-# UNPACK #-} !Int
                  deriving (Show, Eq, Ord)

newtype FacePos = FacePos VoxelPos deriving ( Eq, Hashable, NFData, G.Vector U.Vector, M.MVector U.MVector, U.Unbox)
Run Code Online (Sandbox Code Playgroud)

哪里VoxelPos有手动滚动的实例使用(Int, Int, Int):

newtype instance U.MVector s VoxelPos = MV_VoxelPos (U.MVector s (Int, Int, Int))
newtype instance U.Vector    VoxelPos = V_VoxelPos  (U.Vector    (Int, Int, Int))
instance U.Unbox VoxelPos
instance M.MVector U.MVector VoxelPos where
  basicLength …
Run Code Online (Sandbox Code Playgroud)

haskell ghc

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

如何在Haskell中将功能DSL转换为Monad?

以下Haskell代码是一个简单的"控制台IO"DSL:

data Ap a = Ap { runAp :: ApStep a }

data ApStep a =
    ApRead   (String -> Ap a)
  | ApReturn a
  | ApWrite  String (Ap a)

ioRead    k   = Ap $ ApRead k
ioReturn  a   = Ap $ ApReturn a
ioWrite   s k = Ap $ ApWrite s k
ioWriteLn s   = ioWrite (s ++ "\n")

apTest =
  ioWriteLn "Hello world!" $
  ioRead $ \i ->
  ioWriteLn ("You wrote [" ++ i ++ "]") $
  ioReturn 10 …
Run Code Online (Sandbox Code Playgroud)

monads dsl haskell

8
推荐指数
3
解决办法
1052
查看次数

Haskell函数测试Int是否是使用无限列表的完美正方形

纯粹是为了愉悦和练习,我试图编写一个简单的Haskell函数来确定整数是否是一个完美的正方形.现在我知道还有其他解决方案,但我想知道是否有办法用无限列表来做到这一点.我从这开始,但由于明显的原因,它不起作用(它永远不会停止!)

    isSquare :: Integer -> Bool
    isSquare n = sum[ 1 | x <- [1..], x*x == n] /= 0
Run Code Online (Sandbox Code Playgroud)

此外,如果我可以添加,有人可以指出如何搜索无限列表的第一个实例然后停止!?

haskell

7
推荐指数
3
解决办法
1667
查看次数

haskell管道串入IO

对不起,如果这是一个常见的问题.我有这个简单的IO()功能:

greeter :: IO()
greeter = do
  putStr "What's your name? "
  name <- getLine
  putStrLn $ "Hi, " ++ name
Run Code Online (Sandbox Code Playgroud)

现在我想调用greeter并同时指定一个预先填充的参数getLine,这样我实际上不需要进行交互.我想象一个像功能的东西

IOwithinputs :: [String] -> IO() -> IO()
Run Code Online (Sandbox Code Playgroud)

那我就做

IOwithinputs ["Buddy"] greeter
Run Code Online (Sandbox Code Playgroud)

这将产生一个IO动作,不需要用户输入,看起来像:

What's your name?
Hi, Buddy
Run Code Online (Sandbox Code Playgroud)

我想这样做而不修改原始IO()功能greeter.我也不想greeter从命令行编译和管道输入.IOwithinputs在Hoogle中我没有看到任何类似的东西.(withArgs引人入胜地命名和命名,但根本不是我想要的.)有一个简单的方法吗?或者由于某种原因它是不可能的?这是Pipes的用途吗?

io haskell

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

Haskell的函数应用程序运算符($)用法

我正在读Bartosz Milewski撰写的一篇文章,其中他定义了以下功能:

instance Applicative Chan where
  pure x = Chan (repeat x)
  (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs)
Run Code Online (Sandbox Code Playgroud)

为什么函数应用程序运算符在括号中?我理解这通常是为了在前缀表示形式中使用中缀函数,但我不明白为什么,在这种情况下,函数不能简单地表达为Chan (zipWith $ fs xs),并想知道它之间的区别是什么二是.

(如果您仍需要上下文,请参阅文章)

haskell functional-programming

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

在树上的haskell折叠操作

data Tree a = Tree a [Tree a]
Run Code Online (Sandbox Code Playgroud)

请注意,我们不允许空树,并且叶子是具有空子列表的树.

treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
Run Code Online (Sandbox Code Playgroud)

鉴于上述信息,我不明白树折叠函数如何通过递归地将折叠操作应用于子树,然后将函数应用于根处的标签以及从子树返回的结果来返回结果.

我也没有得到树Fold函数如何只接受一个参数而不是2,当它作为参数传递给map函数并且它仍然编译并正确运行时.

例如,下面的树大小函数计算树的节点.

treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
Run Code Online (Sandbox Code Playgroud)

因此运行treeSize树,其中tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]的大小为4.

在上面的树大小函数中,树折函数也传递一个参数而不是两个.另外,传递给树折函数的x并没有在任何地方使用,所以为什么你需要它.删除它会导致程序无法编译,并提供以下错误消息.

 Couldn't match type `a' with `[[Int] …
Run Code Online (Sandbox Code Playgroud)

tree haskell fold

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

在列表上使用不同的排序

在Haskell中,[a]的默认排序,给定a的排序,似乎是一个词典排序(侧面问题:我在哪里可以找出是否真的如此)?我想要的是一个分级的词典排序(也称为"长度加词典"排序).

我如何指定我希望以分级的词典编纂方式进行比较?我只想要一种类型,而不是所有[a].我试过这个:

instance Ord [Int] where
  compare xs ys = case compare (length xs) (length ys) of
                          LT -> LT
                          GT -> GT
                          EQ -> lexicographic_compare xs ys
Run Code Online (Sandbox Code Playgroud)

但收到此错误消息:

> [1 of 1] Compiling Main             ( test.hs, interpreted )
test.hs:1:10:
    Illegal instance declaration for `Ord [Int]'
      (All instance types must be of the form (T a1 ... an)
       where a1 ... an are *distinct type variables*,
       and each type variable appears at most once in the instance head.
       Use -XFlexibleInstances …
Run Code Online (Sandbox Code Playgroud)

haskell

3
推荐指数
3
解决办法
389
查看次数

Haskell列表连接推断类型

尝试使用新元素替换给定点的列表中的元素,然后返回该元素.

 setelt :: Int -> [a] -> a -> [a]
 setelt x (yf:(y:yl)) z
   | x == (length yf) = (yf:(z:yl))
Run Code Online (Sandbox Code Playgroud)

结果出现此错误:

Inferred type is not general enough
Expression    : setelt
Expected type : Int -> [a] -> a -> [a]
Inferred type : Int -> [[a]] -> [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)

似乎没有连接的问题yf:y:yl所以不确定如何解决.

haskell list inferred-type

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

Haskell - 快乐 - "没有实例......"错误

我正在尝试熟悉Haskell的Happy parser生成器.目前,我有一个文档的例子,但是当我编译程序时,我收到一个错误.这是代码:

{
module Main where
import Data.Char
}

%name calc
%tokentype { Token }
%error { parseError }

%token 
      let             { TokenLet }
      in              { TokenIn }
      int             { TokenInt $$ }
      var             { TokenVar $$ }
      '='             { TokenEq }
      '+'             { TokenPlus }
      '-'             { TokenMinus }
      '*'             { TokenTimes }
      '/'             { TokenDiv }
      '('             { TokenOB }
      ')'             { TokenCB }

%%

Exp   : let var '=' Exp in Exp  { \p -> $6 (($2,$4 …
Run Code Online (Sandbox Code Playgroud)

parsing haskell happy

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

使用Haskell中的元组列表

我在Haskell中有一个10元组的列表,我想从元组列表中获得第n个元组.但正如我所看到的,只有长度函数与该列表一起使用.,!! 功能不起作用.你能告诉我该怎么办?元组由整数和字符串组成.例如,当我尝试这个:

tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]
Run Code Online (Sandbox Code Playgroud)

我从拥抱中收到此错误消息:

ERROR - Cannot find "show" function for:
*** Expression : tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]
*** Of type    : [(Integer,Integer,[Char],[Char],[Char],[Char],[Char],[Char],[Char],[Char])]
Run Code Online (Sandbox Code Playgroud)

haskell tuples list

-1
推荐指数
1
解决办法
598
查看次数

标签 统计

haskell ×11

list ×2

dsl ×1

fold ×1

functional-programming ×1

ghc ×1

happy ×1

inferred-type ×1

io ×1

monads ×1

parsing ×1

tree ×1

tuples ×1