小编Wil*_*ess的帖子

在Haskell中执行断言

假设我有一个计算两个数字之和的函数:

computeSum :: Int -> Int -> Int
computeSum x y = x + y
Run Code Online (Sandbox Code Playgroud)

是否有任何形式的控制来自上述函数的返回值,我只想总结两个数字,其总和是非负数且必须小于10

我刚从命令式开始进行函数式编程,我们可以简单地检查函数返回值的命令式编程,例如:

if value <= 10 and value > 0:
   return value
Run Code Online (Sandbox Code Playgroud)

只是想知道在haskell中是否有类似的东西?

haskell assertion

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

如何修复我的代码中的错误('无法构造无限类型')以及如何使我的代码工作

基本上我正在尝试执行一个函数,在这个函数中给出一个列表和一个数字,你必须将列表拆分为与给定数字大小相同的列表,并且所有列表的最后一次拆分的长度都应该低于给定的数字

separa a xs = if length xs >= a then separaM a (drop a xs) ([take a xs]) else [xs]

separaM a xs yss = if length xs >= a then separaM a (drop a xs) (yss : (take a xs)) else separaM a [] (yss : xs)
separaM a [] yss = yss
Run Code Online (Sandbox Code Playgroud)

我希望3"comovais"的输出为["com","ova","is"]但是在我的程序中由于错误而没有输出

haskell list

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

列出由一个列表组成的自有类型的操作

我得到的类型" Signal"只是一个双打列表,我想使用正常的列表操作,如本机上[Double].这应该是可能的,但它不会编译.您如何向编译器语法正确描述这一点.

这是测试代码:

data Signal = Signal [Double] deriving(Show, Eq)

test :: Signal
test = Signal [1.0,2.0,3.0]

take2 :: Signal -> Signal
take2 s = take 2 s
Run Code Online (Sandbox Code Playgroud)

预期: take2 test = [1.0,2.0]

实际:

"Couldn't match expected type ‘Signal’ with actual type ‘[a0]’
In the expression: take 2 s
In an equation for ‘take2’: take2 s = take 2 s"
Run Code Online (Sandbox Code Playgroud)

haskell ghci

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

哈斯克尔获得第一名和第七名

我需要在Haskell中编写一个函数,给定一个至少包含7个元素的列表,返回一个包含第一个和第七个元素的元组.

例如

Prelude> take1and7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1, 7)
Run Code Online (Sandbox Code Playgroud)

我试过这个

take1and7 :: [a] -> (a, a)
take1and7 [a, b, c, d, e, f, g, xs] = (a, g)
Run Code Online (Sandbox Code Playgroud)

但它说它有"非详尽的模式",我不明白

syntax haskell functional-programming pattern-matching non-exhaustive-patterns

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

如何处理返回任一monad的函数

我试图在我的代码中加入错误处理.

我正在调用一个函数

generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg) 
            => X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg 
            -> m (Either Error CertificationRequest) 
Run Code Online (Sandbox Code Playgroud)

所以我需要在这种情况下处理错误.我以为我可以做这样的事情

case generateCSR (parameters) of
 Right req -> req
 left Error -> putStrLn ("Error : " ++ show Error)
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

但如果我做这样的事情

 Right req <- generateCSR (parameters)
 putStrLn.show req 
Run Code Online (Sandbox Code Playgroud)

它给了我一个输出.

如何在此处实现错误处理?我在第一种情况下(case of声明)做了一些完全错误的事情吗?

monads haskell

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

如何使用带有IO读取Int的绑定重写`do`块?

所以,我想prog使用>>/ >>=bindings而不是do和重写给定的函数<-:

prog :: IO Int
     prog =
       do putStrLn "Hello there! How old are you?"
       age <- (readLn :: IO Int)
       let agedays = show $ age * 365
       putStrLn $ "So you are at least than " ++ agedays ++ " days old."
       return (read agedays)
Run Code Online (Sandbox Code Playgroud)

重写更简单的功能对我来说不是问题,但是readLn :: IO Int让我头疼...

我的建议是:

prog :: IO Int
prog =
     putStrLn "Hello there!How old are you?" >>
     readLn::IO >>=
     let …
Run Code Online (Sandbox Code Playgroud)

io monads haskell function do-notation

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

打印教堂布尔值

以下代码旨在将布尔型的Church编码打印为Haskell的Bool

{-#LANGUAGE FlexibleInstances #-}

instance Show (t -> t -> t) where
  show b = show $ b True False
Run Code Online (Sandbox Code Playgroud)

导致此错误:

<interactive>:4:21: error:
• Couldn't match expected type ‘t’ with actual type ‘Bool’
  ‘t’ is a rigid type variable bound by
    the instance declaration at <interactive>:3:10-27
• In the first argument of ‘b’, namely ‘True’
  In the second argument of ‘($)’, namely ‘b True False’
  In the expression: show $ b True False
• Relevant bindings include
    b …
Run Code Online (Sandbox Code Playgroud)

haskell types type-inference church-encoding

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

是ha句柄还是lambda函数(或两者)?

我正在从Haskell Wikibook看一个简单的IO程序。该页面上显示的构造效果很好,但是我试图理解“如何”。

writeChar下面的函数采用一个文件路径(作为字符串)和一个字符,并将该字符写入给定路径的文件中。该函数使用括号来确保文件正确打开和关闭。在方括号中进行的三个计算中,“在中间进行运算”(据我所知)是一个lambda函数,可返回的结果hPutChar h c

现在,hPutChar它本身具有的声明hPutChar :: Handle -> Char -> IO ()。这是我迷路的地方。我似乎已经过关hhPutChar。我希望一个句柄能以某种方式引用打开的文件fp,但相反,它似乎是递归调用lambda函数\h。我没有看到这个lambda函数调用自身递归是如何知道写c在文件fp

我想了解为什么不应该阅读此函数的最后一行(\h -> hPutChar fp c)。尝试以这种方式运行它会导致“无法将类型'[Char]'与'Handle'匹配”,鉴于hPutChar期望使用Handle数据类型而不是字符串,因此我认为这是明智的。

import Control.Exception
writeChar :: FilePath -> Char -> IO ()
writeChar fp c =
    bracket
      (openFile fp WriteMode)
      hClose
      (\h -> hPutChar h c)
Run Code Online (Sandbox Code Playgroud)

syntax lambda haskell functional-programming io-monad

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

即使有确切的数字,“'Node'应用于的参数太少”

sa是类型变量。在构造函数中,前两个参数是数据,然后是父级,在图形中的级别以及子级列表。

data Node s a = Root | Node s a (Node s a) Int [Node s a]
createRoot :: (ProblemState s a) => s-> a -> Node s a
createRoot state act= Node (state act Root 0 [])
Run Code Online (Sandbox Code Playgroud)

我已经将完全相同的5个参数传递给Node构造函数,但是我遇到了错误。

• Couldn't match expected type ‘Node s a’
              with actual type ‘a1
                                -> Node s1 a1 -> Int -> [Node s1 a1] -> Node s1 a1’
• Probable cause: ‘Node’ is applied to too few arguments
  In …
Run Code Online (Sandbox Code Playgroud)

syntax haskell function-call

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

我可以在不使用“主要”功能的情况下拥有单独的用于读写Haskell中的txt文件的功能吗?

我正在使用Haskell编写程序,该程序需要简单的保存和加载功能。当我调用保存功能时,我需要将一个字符串放入文本文件中。调用load时,需要将字符串从文本文件中拉出。

我知道Haskell中围绕IO的复杂性。从网上的一些阅读中,我发现可以通过“主要”功能来实现。但是,我似乎只能实现保存或加载……不能同时实现。

例如,我目前具有以下功能,用于从文件读取。

main = do  
 contents <- readFile "Test.txt"  
 putStrLn contents  
Run Code Online (Sandbox Code Playgroud)

我还如何实现写功能?是否必须在同一功能内?还是可以分开?另外,有没有办法让我命名函数load / save?当我实际上想调用“加载”或“保存”时必须调用“ main”是很烦的。

我在网上找不到有人同时实现这两个功能的任何示例,而我发现的任何一个实现都总是通过主要功能执行。

任何建议将不胜感激。

io haskell program-entry-point do-notation io-monad

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